@ndla/primitives 1.0.116-alpha.0 → 1.0.118-alpha.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.
@@ -53,42 +53,27 @@
53
53
  "borderWidth]___[value:0 1px 1px",
54
54
  "borderStyle]___[value:solid",
55
55
  "borderColor]___[value:stroke.default",
56
- "marginInlineStart]___[value:small",
57
- "paddingInlineStart]___[value:small",
58
- "marginInlineStart]___[value:0 !important]___[cond:& > li<___>& > ul",
56
+ "paddingInlineStart]___[value:large",
57
+ "marginBlock]___[value:small]___[cond:& > li",
59
58
  "position]___[value:absolute]___[cond:& > li<___>_before",
60
- "transform]___[value:translateX(calc(-100% + (token(spacing.small) * -1)))]___[cond:& > li<___>_before",
59
+ "transform]___[value:translateX(calc(-100% - token(spacing.small)))]___[cond:& > li<___>_before",
61
60
  "fontVariantNumeric]___[value:tabular-nums]___[cond:& > li<___>_before",
62
- "marginBlock]___[value:small]___[cond:& li",
63
- "marginInlineStart]___[value:0]___[cond:& > ol:not([data-variant='letters'])",
64
- "paddingInlineStart]___[value:0]___[cond:& > ol:not([data-variant='letters'])",
65
- "counterReset]___[value:level1",
66
- "counterReset]___[value:level1 var(--start, 0)]___[cond:&[data-count='true']",
67
- "counterIncrement]___[value:level1]___[cond:& > li",
68
- "content]___[value:counter(level1, decimal) '. ']___[cond:& > li<___>_before",
69
- "counterReset]___[value:level2]___[cond:& > li<___>& > ol:not([data-variant='letters'])",
70
- "counterReset]___[value:level2 var(--start, 0)]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>&[data-count='true']",
71
- "marginInlineStart]___[value:small]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li",
72
- "counterIncrement]___[value:level2]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li",
73
- "content]___[value:counter(level1, decimal) '.' counter(level2, decimal) '. ']___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>_before",
74
- "counterReset]___[value:level3]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])",
75
- "counterReset]___[value:level3 var(--start, 0)]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>&[data-count='true']",
76
- "marginInlineStart]___[value:calc(1.5ch + token(spacing.small))]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li",
77
- "counterIncrement]___[value:level3]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li",
78
- "content]___[value:counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '. ']___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>_before",
79
- "counterReset]___[value:level4]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])",
80
- "counterReset]___[value:level4 var(--start, 0)]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>&[data-count='true']",
81
- "marginInlineStart]___[value:calc(3ch + token(spacing.small))]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li",
82
- "counterIncrement]___[value:level4]___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li",
83
- "content]___[value:counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.' counter(level4, decimal) '. ']___[cond:& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>& > ol:not([data-variant='letters'])<___>& > li<___>_before",
84
- "marginInlineStart]___[value:0]___[cond:& > ol[data-variant='letters']",
85
- "paddingInlineStart]___[value:0]___[cond:& > ol[data-variant='letters']",
86
- "content]___[value:counter(level1, upper-alpha) '. ']___[cond:& > li<___>_before",
87
- "content]___[value:counter(level1, lower-alpha) '. ']___[cond:& > li<___>& > ol[data-variant='letters'] > li<___>_before",
88
- "content]___[value:counter(level1, lower-roman) '. ']___[cond:& > li<___>& > ol[data-variant='letters'] > li<___>& > ol[data-variant='letters'] > li<___>_before",
61
+ "counterReset]___[value:var(--counter-name, numbers) var(--start, 0)",
62
+ "counterIncrement]___[value:var(--counter-name, numbers)]___[cond:& > li",
63
+ "content]___[value:counters(var(--counter-name, numbers), \".\") \". \"]___[cond:& > li<___>_before",
64
+ "paddingInlineStart]___[value:small]___[cond:& > li<___>& > ol:not([data-variant='letters']) > li",
65
+ "paddingInlineStart]___[value:large]___[cond:& > li<___>& > ol:not([data-variant='letters']) > li<___>& > ol:not([data-variant='letters']) > li",
66
+ "paddingInlineStart]___[value:xxlarge]___[cond:& > li<___>& > ol:not([data-variant='letters']) > li<___>& > ol:not([data-variant='letters']) > li<___>& > ol:not([data-variant='letters']) > li",
67
+ "counterReset]___[value:letters var(--start, 0)",
68
+ "counterIncrement]___[value:letters]___[cond:& > li",
69
+ "content]___[value:counter(letters, upper-alpha) \". \"]___[cond:& > li<___>_before",
70
+ "content]___[value:counter(letters, lower-alpha) \". \"]___[cond:& > li<___>& > ol[data-variant='letters'] > li<___>_before",
71
+ "content]___[value:counter(letters, lower-roman) \". \"]___[cond:& > li<___>& > ol[data-variant='letters'] > li<___>& > ol[data-variant='letters'] > li<___>_before",
89
72
  "listStyle]___[value:revert",
90
73
  "marginInlineStart]___[value:medium",
74
+ "paddingInlineStart]___[value:small",
91
75
  "marginInlineStart]___[value:0]___[cond:& ul",
76
+ "marginBlock]___[value:small]___[cond:& li",
92
77
  "paddingInlineStart]___[value:small]___[cond:& li",
93
78
  "color]___[value:icon.strong]___[cond:& li<___>_marker",
94
79
  "marginInlineStart]___[value:0 !important]___[cond:& li<___>& > ol",
package/dist/styles.css CHANGED
@@ -661,22 +661,26 @@
661
661
  border-bottom-right-radius: var(--radii-xsmall);
662
662
  }
663
663
 
664
- .ms_small {
665
- margin-inline-start: var(--spacing-small);
664
+ .ps_large {
665
+ padding-inline-start: var(--spacing-large);
666
666
  }
667
667
 
668
- .ps_small {
669
- padding-inline-start: var(--spacing-small);
668
+ .counter-reset_var\(--counter-name\,_numbers\)_var\(--start\,_0\) {
669
+ counter-reset: var(--counter-name, numbers) var(--start, 0);
670
670
  }
671
671
 
672
- .counter-reset_level1 {
673
- counter-reset: level1;
672
+ .counter-reset_letters_var\(--start\,_0\) {
673
+ counter-reset: letters var(--start, 0);
674
674
  }
675
675
 
676
676
  .ms_medium {
677
677
  margin-inline-start: var(--spacing-medium);
678
678
  }
679
679
 
680
+ .ps_small {
681
+ padding-inline-start: var(--spacing-small);
682
+ }
683
+
680
684
  .li-t_disc {
681
685
  list-style-type: disc;
682
686
  }
@@ -1633,7 +1637,7 @@
1633
1637
  background: var(--colors-surface-default);
1634
1638
  }
1635
1639
 
1636
- .\[\&_li\]\:my_small li {
1640
+ .\[\&_\>_li\]\:my_small > li,.\[\&_li\]\:my_small li {
1637
1641
  margin-block: var(--spacing-small);
1638
1642
  }
1639
1643
 
@@ -1767,28 +1771,12 @@
1767
1771
  transform: rotate(180deg);
1768
1772
  }
1769
1773
 
1770
- .\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:ms_0 > ol:not([data-variant='letters']) {
1771
- margin-inline-start: 0;
1772
- }
1773
-
1774
- .\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:ps_0 > ol:not([data-variant='letters']) {
1775
- padding-inline-start: 0;
1776
- }
1777
-
1778
- .\[\&\[data-count\=\'true\'\]\]\:counter-reset_level1_var\(--start\,_0\)[data-count='true'] {
1779
- counter-reset: level1 var(--start, 0);
1774
+ .\[\&_\>_li\]\:counter-increment_var\(--counter-name\,_numbers\) > li {
1775
+ counter-increment: var(--counter-name, numbers);
1780
1776
  }
1781
1777
 
1782
- .\[\&_\>_li\]\:counter-increment_level1 > li {
1783
- counter-increment: level1;
1784
- }
1785
-
1786
- .\[\&_\>_ol\[data-variant\=\'letters\'\]\]\:ms_0 > ol[data-variant='letters'] {
1787
- margin-inline-start: 0;
1788
- }
1789
-
1790
- .\[\&_\>_ol\[data-variant\=\'letters\'\]\]\:ps_0 > ol[data-variant='letters'] {
1791
- padding-inline-start: 0;
1778
+ .\[\&_\>_li\]\:counter-increment_letters > li {
1779
+ counter-increment: letters;
1792
1780
  }
1793
1781
 
1794
1782
  .\[\&_ul\]\:ms_0 ul {
@@ -2547,32 +2535,28 @@
2547
2535
  color: var(--colors-text-disabled);
2548
2536
  }
2549
2537
 
2550
- .\[\&_\>_li\]\:\[\&_\>_ul\]\:ms_0\! > li > ul {
2551
- margin-inline-start: 0 !important;
2552
- }
2553
-
2554
2538
  .\[\&_\>_li\]\:before\:pos_absolute > li::before {
2555
2539
  position: absolute;
2556
2540
  }
2557
2541
 
2558
- .\[\&_\>_li\]\:before\:trf_translateX\(calc\(-100\%_\+_\(token\(spacing\.small\)_\*_-1\)\)\) > li::before {
2559
- transform: translateX(calc(-100% + (var(--spacing-small) * -1)));
2542
+ .\[\&_\>_li\]\:before\:trf_translateX\(calc\(-100\%_-_token\(spacing\.small\)\)\) > li::before {
2543
+ transform: translateX(calc(-100% - var(--spacing-small)));
2560
2544
  }
2561
2545
 
2562
2546
  .\[\&_\>_li\]\:before\:fv-num_tabular-nums > li::before {
2563
2547
  font-variant-numeric: tabular-nums;
2564
2548
  }
2565
2549
 
2566
- .\[\&_\>_li\]\:before\:content_counter\(level1\,_decimal\)_\'\._\' > li::before {
2567
- content: counter(level1, decimal) '. ';
2550
+ .\[\&_\>_li\]\:before\:content_counters\(var\(--counter-name\,_numbers\)\,_\"\.\"\)_\"\._\" > li::before {
2551
+ content: counters(var(--counter-name, numbers), ".") ". ";
2568
2552
  }
2569
2553
 
2570
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:counter-reset_level2 > li > ol:not([data-variant='letters']) {
2571
- counter-reset: level2;
2554
+ .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)_\>_li\]\:ps_small > li > ol:not([data-variant='letters']) > li {
2555
+ padding-inline-start: var(--spacing-small);
2572
2556
  }
2573
2557
 
2574
- .\[\&_\>_li\]\:before\:content_counter\(level1\,_upper-alpha\)_\'\._\' > li::before {
2575
- content: counter(level1, upper-alpha) '. ';
2558
+ .\[\&_\>_li\]\:before\:content_counter\(letters\,_upper-alpha\)_\"\._\" > li::before {
2559
+ content: counter(letters, upper-alpha) ". ";
2576
2560
  }
2577
2561
 
2578
2562
  .\[\&_li\]\:marker\:c_icon\.strong li::marker,.\[\&_li\]\:marker\:c_icon\.strong li::-webkit-details-marker {
@@ -2789,20 +2773,12 @@
2789
2773
  border-color: var(--colors-stroke-hover);
2790
2774
  }
2791
2775
 
2792
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&\[data-count\=\'true\'\]\]\:counter-reset_level2_var\(--start\,_0\) > li > ol:not([data-variant='letters'])[data-count='true'] {
2793
- counter-reset: level2 var(--start, 0);
2794
- }
2795
-
2796
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:ms_small > li > ol:not([data-variant='letters']) > li {
2797
- margin-inline-start: var(--spacing-small);
2776
+ .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)_\>_li\]\:ps_large > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li {
2777
+ padding-inline-start: var(--spacing-large);
2798
2778
  }
2799
2779
 
2800
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:counter-increment_level2 > li > ol:not([data-variant='letters']) > li {
2801
- counter-increment: level2;
2802
- }
2803
-
2804
- .\[\&_\>_li\]\:\[\&_\>_ol\[data-variant\=\'letters\'\]_\>_li\]\:before\:content_counter\(level1\,_lower-alpha\)_\'\._\' > li > ol[data-variant='letters'] > li::before {
2805
- content: counter(level1, lower-alpha) '. ';
2780
+ .\[\&_\>_li\]\:\[\&_\>_ol\[data-variant\=\'letters\'\]_\>_li\]\:before\:content_counter\(letters\,_lower-alpha\)_\"\._\" > li > ol[data-variant='letters'] > li::before {
2781
+ content: counter(letters, lower-alpha) ". ";
2806
2782
  }
2807
2783
 
2808
2784
  .disabled\:checked\:hover\:c_text\.disabled:is(:disabled, [disabled], [data-disabled], [aria-disabled=true]):is(:checked, [data-checked], [aria-checked=true], [data-state="checked"]):is(:hover, [data-hover]) {
@@ -2825,52 +2801,12 @@
2825
2801
  transform: translateX(120%);
2826
2802
  }
2827
2803
 
2828
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:before\:content_counter\(level1\,_decimal\)_\'\.\'_counter\(level2\,_decimal\)_\'\._\' > li > ol:not([data-variant='letters']) > li::before {
2829
- content: counter(level1, decimal) '.' counter(level2, decimal) '. ';
2830
- }
2831
-
2832
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:counter-reset_level3 > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) {
2833
- counter-reset: level3;
2834
- }
2835
-
2836
- .\[\&_\>_li\]\:\[\&_\>_ol\[data-variant\=\'letters\'\]_\>_li\]\:\[\&_\>_ol\[data-variant\=\'letters\'\]_\>_li\]\:before\:content_counter\(level1\,_lower-roman\)_\'\._\' > li > ol[data-variant='letters'] > li > ol[data-variant='letters'] > li::before {
2837
- content: counter(level1, lower-roman) '. ';
2838
- }
2839
-
2840
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&\[data-count\=\'true\'\]\]\:counter-reset_level3_var\(--start\,_0\) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters'])[data-count='true'] {
2841
- counter-reset: level3 var(--start, 0);
2842
- }
2843
-
2844
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:ms_calc\(1\.5ch_\+_token\(spacing\.small\)\) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li {
2845
- margin-inline-start: calc(1.5ch + var(--spacing-small));
2846
- }
2847
-
2848
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:counter-increment_level3 > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li {
2849
- counter-increment: level3;
2850
- }
2851
-
2852
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:before\:content_counter\(level1\,_decimal\)_\'\.\'_counter\(level2\,_decimal\)_\'\.\'_counter\(level3\,_decimal\)_\'\._\' > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li::before {
2853
- content: counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '. ';
2854
- }
2855
-
2856
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:counter-reset_level4 > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) {
2857
- counter-reset: level4;
2858
- }
2859
-
2860
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&\[data-count\=\'true\'\]\]\:counter-reset_level4_var\(--start\,_0\) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters'])[data-count='true'] {
2861
- counter-reset: level4 var(--start, 0);
2862
- }
2863
-
2864
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:ms_calc\(3ch_\+_token\(spacing\.small\)\) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li {
2865
- margin-inline-start: calc(3ch + var(--spacing-small));
2866
- }
2867
-
2868
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:counter-increment_level4 > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li {
2869
- counter-increment: level4;
2804
+ .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)_\>_li\]\:ps_xxlarge > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li {
2805
+ padding-inline-start: var(--spacing-xxlarge);
2870
2806
  }
2871
2807
 
2872
- .\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:\[\&_\>_ol\:not\(\[data-variant\=\'letters\'\]\)\]\:\[\&_\>_li\]\:before\:content_counter\(level1\,_decimal\)_\'\.\'_counter\(level2\,_decimal\)_\'\.\'_counter\(level3\,_decimal\)_\'\.\'_counter\(level4\,_decimal\)_\'\._\' > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li > ol:not([data-variant='letters']) > li::before {
2873
- content: counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.' counter(level4, decimal) '. ';
2808
+ .\[\&_\>_li\]\:\[\&_\>_ol\[data-variant\=\'letters\'\]_\>_li\]\:\[\&_\>_ol\[data-variant\=\'letters\'\]_\>_li\]\:before\:content_counter\(letters\,_lower-roman\)_\"\._\" > li > ol[data-variant='letters'] > li > ol[data-variant='letters'] > li::before {
2809
+ content: counter(letters, lower-roman) ". ";
2874
2810
  }
2875
2811
 
2876
2812
  @media screen and (min-width: 29.75rem) {
@@ -2,7 +2,7 @@ import { ark } from "@ark-ui/react";
2
2
  import { css, cva } from "@ndla/styled-system/css";
3
3
  import { styled } from "@ndla/styled-system/jsx";
4
4
  import { jsx } from "react/jsx-runtime";
5
- import { forwardRef, useMemo } from "react";
5
+ import { forwardRef, useId, useMemo } from "react";
6
6
 
7
7
  //#region src/ArticleLists.tsx
8
8
  /**
@@ -12,78 +12,42 @@ import { forwardRef, useMemo } from "react";
12
12
  * LICENSE file in the root directory of this source tree.
13
13
  *
14
14
  */
15
- const LIST_ITEM = "& > li";
16
- const LETTER_LIST = "& > ol[data-variant='letters']";
17
- const NUMBER_LIST = "& > ol:not([data-variant='letters'])";
18
- const LETTER_LIST_ITEM = `${LETTER_LIST} > li`;
19
15
  const orderedListRecipe = cva({
20
16
  base: {
21
- marginInlineStart: "small",
22
- paddingInlineStart: "small",
23
- [LIST_ITEM]: {
24
- "& > ul": { marginInlineStart: "0 !important" },
17
+ paddingInlineStart: "large",
18
+ "& > li": {
19
+ marginBlock: "small",
25
20
  _before: {
26
21
  position: "absolute",
27
- transform: "translateX(calc(-100% + (token(spacing.small) * -1)))",
22
+ transform: "translateX(calc(-100% - token(spacing.small)))",
28
23
  fontVariantNumeric: "tabular-nums"
29
24
  }
30
- },
31
- "& li": { marginBlock: "small" }
25
+ }
32
26
  },
33
27
  defaultVariants: { variant: "numbers" },
34
28
  variants: { variant: {
35
29
  numbers: {
36
- [NUMBER_LIST]: {
37
- marginInlineStart: "0",
38
- paddingInlineStart: "0"
39
- },
40
- counterReset: "level1",
41
- "&[data-count='true']": { counterReset: "level1 var(--start, 0)" },
42
- [LIST_ITEM]: {
43
- counterIncrement: "level1",
44
- _before: { content: "counter(level1, decimal) '. '" },
45
- [NUMBER_LIST]: {
46
- counterReset: "level2",
47
- "&[data-count='true']": { counterReset: "level2 var(--start, 0)" },
48
- [LIST_ITEM]: {
49
- marginInlineStart: "small",
50
- counterIncrement: "level2",
51
- _before: { content: "counter(level1, decimal) '.' counter(level2, decimal) '. '" },
52
- [NUMBER_LIST]: {
53
- counterReset: "level3",
54
- "&[data-count='true']": { counterReset: "level3 var(--start, 0)" },
55
- [LIST_ITEM]: {
56
- marginInlineStart: "calc(1.5ch + token(spacing.small))",
57
- counterIncrement: "level3",
58
- _before: { content: "counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '. '" },
59
- [NUMBER_LIST]: {
60
- counterReset: "level4",
61
- "&[data-count='true']": { counterReset: "level4 var(--start, 0)" },
62
- [LIST_ITEM]: {
63
- marginInlineStart: "calc(3ch + token(spacing.small))",
64
- counterIncrement: "level4",
65
- _before: { content: "counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.' counter(level4, decimal) '. '" }
66
- }
67
- }
68
- }
69
- }
30
+ counterReset: "var(--counter-name, numbers) var(--start, 0)",
31
+ "& > li": {
32
+ counterIncrement: "var(--counter-name, numbers)",
33
+ _before: { content: `counters(var(--counter-name, numbers), ".") ". "` },
34
+ "& > ol:not([data-variant='letters']) > li": {
35
+ paddingInlineStart: "small",
36
+ "& > ol:not([data-variant='letters']) > li": {
37
+ paddingInlineStart: "large",
38
+ "& > ol:not([data-variant='letters']) > li": { paddingInlineStart: "xxlarge" }
70
39
  }
71
40
  }
72
41
  }
73
42
  },
74
43
  letters: {
75
- counterReset: "level1",
76
- "&[data-count='true']": { counterReset: "level1 var(--start, 0)" },
77
- [LETTER_LIST]: {
78
- marginInlineStart: "0",
79
- paddingInlineStart: "0"
80
- },
81
- [LIST_ITEM]: {
82
- counterIncrement: "level1",
83
- _before: { content: "counter(level1, upper-alpha) '. '" },
84
- [LETTER_LIST_ITEM]: {
85
- _before: { content: "counter(level1, lower-alpha) '. '" },
86
- [LETTER_LIST_ITEM]: { _before: { content: "counter(level1, lower-roman) '. '" } }
44
+ counterReset: "letters var(--start, 0)",
45
+ "& > li": {
46
+ counterIncrement: "letters",
47
+ _before: { content: `counter(letters, upper-alpha) ". "` },
48
+ "& > ol[data-variant='letters'] > li": {
49
+ _before: { content: `counter(letters, lower-alpha) ". "` },
50
+ "& > ol[data-variant='letters'] > li": { _before: { content: `counter(letters, lower-roman) ". "` } }
87
51
  }
88
52
  }
89
53
  }
@@ -91,18 +55,27 @@ const orderedListRecipe = cva({
91
55
  });
92
56
  const StyledOrderedList = styled(ark.ol, {}, { baseComponent: true });
93
57
  const OrderedList = forwardRef(({ variant, css: cssProp, start, ...props }, ref) => {
94
- const style = useMemo(() => ({ "--start": start ? start - 1 : void 0 }), [start]);
58
+ const counterId = useId();
59
+ const style = useMemo(() => ({
60
+ "--start": start ? start - 1 : 0,
61
+ "--counter-name": variant === "letters" ? counterId : void 0
62
+ }), [
63
+ counterId,
64
+ start,
65
+ variant
66
+ ]);
95
67
  return /* @__PURE__ */ jsx(StyledOrderedList, {
96
68
  "data-embed-type": "ordered-list",
97
69
  "data-variant": variant,
98
- "data-count": start !== void 0,
70
+ start,
71
+ type: variant === "letters" ? "A" : void 0,
99
72
  css: css.raw(orderedListRecipe.raw({ variant }), cssProp),
100
73
  style,
101
74
  ref,
102
75
  ...props
103
76
  });
104
77
  });
105
- const UnOrderedList = styled("ul", { base: {
78
+ const StyledUnOrderedList = styled("ul", { base: {
106
79
  listStyle: "revert",
107
80
  marginInlineStart: "medium",
108
81
  paddingInlineStart: "small",
@@ -119,6 +92,14 @@ const UnOrderedList = styled("ul", { base: {
119
92
  "& > li > ul": { listStyleType: "square" }
120
93
  }
121
94
  } });
95
+ const UnOrderedList = forwardRef((props, ref) => {
96
+ const counterId = useId();
97
+ return /* @__PURE__ */ jsx(StyledUnOrderedList, {
98
+ ref,
99
+ style: useMemo(() => ({ "--counter-name": counterId }), [counterId]),
100
+ ...props
101
+ });
102
+ });
122
103
  const DefinitionList = styled("dl", { base: {
123
104
  "& dt": { fontWeight: "bold" },
124
105
  "& dd": { marginInlineStart: "medium" }
@@ -1 +1 @@
1
- {"version":3,"file":"ArticleLists.mjs","names":[],"sources":["../src/ArticleLists.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type CSSProperties, forwardRef, useMemo } from \"react\";\nimport { type HTMLArkProps, ark } from \"@ark-ui/react\";\nimport { css, cva } from \"@ndla/styled-system/css\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { HTMLStyledProps, RecipeVariantProps, StyledProps } from \"@ndla/styled-system/types\";\n\nconst LIST_ITEM = \"& > li\";\nconst LETTER_LIST = \"& > ol[data-variant='letters']\";\nconst NUMBER_LIST = \"& > ol:not([data-variant='letters'])\";\nconst LETTER_LIST_ITEM = `${LETTER_LIST} > li`;\n\nconst orderedListRecipe = cva({\n base: {\n marginInlineStart: \"small\",\n paddingInlineStart: \"small\",\n [LIST_ITEM]: {\n \"& > ul\": {\n marginInlineStart: \"0 !important\",\n },\n _before: {\n position: \"absolute\",\n transform: \"translateX(calc(-100% + (token(spacing.small) * -1)))\",\n fontVariantNumeric: \"tabular-nums\",\n },\n },\n \"& li\": {\n marginBlock: \"small\",\n },\n },\n defaultVariants: {\n variant: \"numbers\",\n },\n variants: {\n variant: {\n numbers: {\n [NUMBER_LIST]: {\n marginInlineStart: \"0\",\n paddingInlineStart: \"0\",\n },\n counterReset: \"level1\",\n \"&[data-count='true']\": {\n counterReset: \"level1 var(--start, 0)\",\n },\n [LIST_ITEM]: {\n counterIncrement: \"level1\",\n _before: {\n content: \"counter(level1, decimal) '. '\",\n },\n [NUMBER_LIST]: {\n counterReset: \"level2\",\n \"&[data-count='true']\": {\n counterReset: \"level2 var(--start, 0)\",\n },\n [LIST_ITEM]: {\n marginInlineStart: \"small\",\n counterIncrement: \"level2\",\n _before: {\n content: \"counter(level1, decimal) '.' counter(level2, decimal) '. '\",\n },\n [NUMBER_LIST]: {\n counterReset: \"level3\",\n \"&[data-count='true']\": {\n counterReset: \"level3 var(--start, 0)\",\n },\n [LIST_ITEM]: {\n marginInlineStart: \"calc(1.5ch + token(spacing.small))\",\n counterIncrement: \"level3\",\n _before: {\n content: \"counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '. '\",\n },\n [NUMBER_LIST]: {\n counterReset: \"level4\",\n \"&[data-count='true']\": {\n counterReset: \"level4 var(--start, 0)\",\n },\n [LIST_ITEM]: {\n marginInlineStart: \"calc(3ch + token(spacing.small))\",\n counterIncrement: \"level4\",\n _before: {\n content:\n \"counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.' counter(level4, decimal) '. '\",\n },\n },\n },\n },\n },\n },\n },\n },\n },\n letters: {\n counterReset: \"level1\",\n \"&[data-count='true']\": {\n counterReset: \"level1 var(--start, 0)\",\n },\n [LETTER_LIST]: {\n marginInlineStart: \"0\",\n paddingInlineStart: \"0\",\n },\n [LIST_ITEM]: {\n counterIncrement: \"level1\",\n _before: {\n content: \"counter(level1, upper-alpha) '. '\",\n },\n [LETTER_LIST_ITEM]: {\n _before: {\n content: \"counter(level1, lower-alpha) '. '\",\n },\n [LETTER_LIST_ITEM]: {\n _before: {\n content: \"counter(level1, lower-roman) '. '\",\n },\n },\n },\n },\n },\n },\n },\n});\n\nexport type OrderedListVariantProps = NonNullable<RecipeVariantProps<typeof orderedListRecipe>>;\n\nexport interface OrderedListProps extends StyledProps, HTMLArkProps<\"ol\">, OrderedListVariantProps {}\n\nconst StyledOrderedList = styled(ark.ol, {}, { baseComponent: true });\n\nexport const OrderedList = forwardRef<HTMLOListElement, OrderedListProps>(\n ({ variant, css: cssProp, start, ...props }, ref) => {\n const style = useMemo(() => ({ \"--start\": start ? start - 1 : undefined }) as CSSProperties, [start]);\n return (\n <StyledOrderedList\n data-embed-type=\"ordered-list\"\n data-variant={variant}\n data-count={start !== undefined}\n css={css.raw(orderedListRecipe.raw({ variant }), cssProp)}\n style={style}\n ref={ref}\n {...props}\n />\n );\n },\n);\n\nexport interface UnOrderedListProps extends StyledProps, HTMLArkProps<\"ul\"> {}\n\nexport const UnOrderedList = styled(\"ul\", {\n base: {\n listStyle: \"revert\",\n marginInlineStart: \"medium\",\n paddingInlineStart: \"small\",\n \"& ul\": {\n marginInlineStart: \"0\",\n },\n \"& li\": {\n marginBlock: \"small\",\n paddingInlineStart: \"small\",\n _marker: {\n color: \"icon.strong\",\n },\n\n \"& > ol\": {\n marginInlineStart: \"0 !important\",\n },\n },\n\n listStyleType: \"disc\",\n \"& > li > ul\": {\n listStyleType: \"circle\",\n \"& > li > ul\": {\n listStyleType: \"square\",\n },\n },\n },\n});\n\nexport const DefinitionList = styled(\"dl\", {\n base: {\n \"& dt\": {\n fontWeight: \"bold\",\n },\n \"& dd\": {\n marginInlineStart: \"medium\",\n },\n },\n});\n\nexport type DefinitionListProps = HTMLStyledProps<\"dl\">;\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,YAAY;AAClB,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,mBAAmB,GAAG,YAAY;AAExC,MAAM,oBAAoB,IAAI;CAC5B,MAAM;EACJ,mBAAmB;EACnB,oBAAoB;GACnB,YAAY;GACX,UAAU,EACR,mBAAmB,gBACpB;GACD,SAAS;IACP,UAAU;IACV,WAAW;IACX,oBAAoB;IACrB;GACF;EACD,QAAQ,EACN,aAAa,SACd;EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACD,UAAU,EACR,SAAS;EACP,SAAS;IACN,cAAc;IACb,mBAAmB;IACnB,oBAAoB;IACrB;GACD,cAAc;GACd,wBAAwB,EACtB,cAAc,0BACf;IACA,YAAY;IACX,kBAAkB;IAClB,SAAS,EACP,SAAS,iCACV;KACA,cAAc;KACb,cAAc;KACd,wBAAwB,EACtB,cAAc,0BACf;MACA,YAAY;MACX,mBAAmB;MACnB,kBAAkB;MAClB,SAAS,EACP,SAAS,8DACV;OACA,cAAc;OACb,cAAc;OACd,wBAAwB,EACtB,cAAc,0BACf;QACA,YAAY;QACX,mBAAmB;QACnB,kBAAkB;QAClB,SAAS,EACP,SAAS,2FACV;SACA,cAAc;SACb,cAAc;SACd,wBAAwB,EACtB,cAAc,0BACf;UACA,YAAY;UACX,mBAAmB;UACnB,kBAAkB;UAClB,SAAS,EACP,SACE,yHACH;UACF;SACF;QACF;OACF;MACF;KACF;IACF;GACF;EACD,SAAS;GACP,cAAc;GACd,wBAAwB,EACtB,cAAc,0BACf;IACA,cAAc;IACb,mBAAmB;IACnB,oBAAoB;IACrB;IACA,YAAY;IACX,kBAAkB;IAClB,SAAS,EACP,SAAS,qCACV;KACA,mBAAmB;KAClB,SAAS,EACP,SAAS,qCACV;MACA,mBAAmB,EAClB,SAAS,EACP,SAAS,qCACV,EACF;KACF;IACF;GACF;EACF,EACF;CACF,CAAC;AAMF,MAAM,oBAAoB,OAAO,IAAI,IAAI,EAAE,EAAE,EAAE,eAAe,MAAM,CAAC;AAErE,MAAa,cAAc,YACxB,EAAE,SAAS,KAAK,SAAS,OAAO,GAAG,SAAS,QAAQ;CACnD,MAAM,QAAQ,eAAe,EAAE,WAAW,QAAQ,QAAQ,IAAI,QAAW,GAAoB,CAAC,MAAM,CAAC;AACrG,QACE,oBAAC;EACC,mBAAgB;EAChB,gBAAc;EACd,cAAY,UAAU;EACtB,KAAK,IAAI,IAAI,kBAAkB,IAAI,EAAE,SAAS,CAAC,EAAE,QAAQ;EAClD;EACF;EACL,GAAI;GACJ;EAGP;AAID,MAAa,gBAAgB,OAAO,MAAM,EACxC,MAAM;CACJ,WAAW;CACX,mBAAmB;CACnB,oBAAoB;CACpB,QAAQ,EACN,mBAAmB,KACpB;CACD,QAAQ;EACN,aAAa;EACb,oBAAoB;EACpB,SAAS,EACP,OAAO,eACR;EAED,UAAU,EACR,mBAAmB,gBACpB;EACF;CAED,eAAe;CACf,eAAe;EACb,eAAe;EACf,eAAe,EACb,eAAe,UAChB;EACF;CACF,EACF,CAAC;AAEF,MAAa,iBAAiB,OAAO,MAAM,EACzC,MAAM;CACJ,QAAQ,EACN,YAAY,QACb;CACD,QAAQ,EACN,mBAAmB,UACpB;CACF,EACF,CAAC"}
1
+ {"version":3,"file":"ArticleLists.mjs","names":[],"sources":["../src/ArticleLists.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type CSSProperties, forwardRef, useId, useMemo } from \"react\";\nimport { type HTMLArkProps, ark } from \"@ark-ui/react\";\nimport { css, cva } from \"@ndla/styled-system/css\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { HTMLStyledProps, RecipeVariantProps, StyledProps } from \"@ndla/styled-system/types\";\n\nconst orderedListRecipe = cva({\n base: {\n paddingInlineStart: \"large\",\n \"& > li\": {\n marginBlock: \"small\",\n _before: {\n position: \"absolute\",\n transform: \"translateX(calc(-100% - token(spacing.small)))\",\n fontVariantNumeric: \"tabular-nums\",\n },\n },\n },\n defaultVariants: {\n variant: \"numbers\",\n },\n variants: {\n variant: {\n numbers: {\n /** We utilize a CSS variable for the counter name to correctly reset counters when nested inside a letter list.\n * This way, the nested number list won't pick up on any other counters named \"numbers\" higher up in the DOM tree.\n * This fixes the following scenario\n * ol (numbers) -> 1.\n * ol(letters) -> A.\n * ol (numbers) -> 1. (Without the CSS variable, this would be 1.1)\n */\n counterReset: \"var(--counter-name, numbers) var(--start, 0)\",\n \"& > li\": {\n counterIncrement: \"var(--counter-name, numbers)\",\n _before: {\n content: `counters(var(--counter-name, numbers), \".\") \". \"`,\n },\n // If a nested OL is not a letters variant, it's a numbers variant. Keep increasing the margin to account for wider numbers.\n \"& > ol:not([data-variant='letters']) > li\": {\n paddingInlineStart: \"small\",\n \"& > ol:not([data-variant='letters']) > li\": {\n paddingInlineStart: \"large\",\n \"& > ol:not([data-variant='letters']) > li\": {\n paddingInlineStart: \"xxlarge\",\n },\n },\n },\n },\n },\n letters: {\n counterReset: \"letters var(--start, 0)\",\n \"& > li\": {\n counterIncrement: \"letters\",\n _before: {\n content: `counter(letters, upper-alpha) \". \"`,\n },\n \"& > ol[data-variant='letters'] > li\": {\n _before: {\n content: `counter(letters, lower-alpha) \". \"`,\n },\n \"& > ol[data-variant='letters'] > li\": {\n _before: {\n content: `counter(letters, lower-roman) \". \"`,\n },\n },\n },\n },\n },\n },\n },\n});\n\nexport type OrderedListVariantProps = NonNullable<RecipeVariantProps<typeof orderedListRecipe>>;\n\nexport interface OrderedListProps extends StyledProps, HTMLArkProps<\"ol\">, OrderedListVariantProps {}\n\nconst StyledOrderedList = styled(ark.ol, {}, { baseComponent: true });\n\nexport const OrderedList = forwardRef<HTMLOListElement, OrderedListProps>(\n ({ variant, css: cssProp, start, ...props }, ref) => {\n const counterId = useId();\n const style = useMemo(\n () =>\n ({\n \"--start\": start ? start - 1 : 0,\n \"--counter-name\": variant === \"letters\" ? counterId : undefined,\n }) as CSSProperties,\n [counterId, start, variant],\n );\n return (\n <StyledOrderedList\n data-embed-type=\"ordered-list\"\n data-variant={variant}\n start={start}\n type={variant === \"letters\" ? \"A\" : undefined}\n css={css.raw(orderedListRecipe.raw({ variant }), cssProp)}\n style={style}\n ref={ref}\n {...props}\n />\n );\n },\n);\n\nexport interface UnOrderedListProps extends StyledProps, HTMLArkProps<\"ul\"> {}\n\nexport const StyledUnOrderedList = styled(\"ul\", {\n base: {\n listStyle: \"revert\",\n marginInlineStart: \"medium\",\n paddingInlineStart: \"small\",\n \"& ul\": {\n marginInlineStart: \"0\",\n },\n \"& li\": {\n marginBlock: \"small\",\n paddingInlineStart: \"small\",\n _marker: {\n color: \"icon.strong\",\n },\n\n \"& > ol\": {\n marginInlineStart: \"0 !important\",\n },\n },\n\n listStyleType: \"disc\",\n \"& > li > ul\": {\n listStyleType: \"circle\",\n \"& > li > ul\": {\n listStyleType: \"square\",\n },\n },\n },\n});\n\nexport const UnOrderedList = forwardRef<HTMLUListElement, UnOrderedListProps>((props, ref) => {\n const counterId = useId();\n\n const style = useMemo(\n () =>\n ({\n \"--counter-name\": counterId,\n }) as CSSProperties,\n [counterId],\n );\n\n return <StyledUnOrderedList ref={ref} style={style} {...props} />;\n});\n\nexport const DefinitionList = styled(\"dl\", {\n base: {\n \"& dt\": {\n fontWeight: \"bold\",\n },\n \"& dd\": {\n marginInlineStart: \"medium\",\n },\n },\n});\n\nexport type DefinitionListProps = HTMLStyledProps<\"dl\">;\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,oBAAoB,IAAI;CAC5B,MAAM;EACJ,oBAAoB;EACpB,UAAU;GACR,aAAa;GACb,SAAS;IACP,UAAU;IACV,WAAW;IACX,oBAAoB;IACrB;GACF;EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACD,UAAU,EACR,SAAS;EACP,SAAS;GAQP,cAAc;GACd,UAAU;IACR,kBAAkB;IAClB,SAAS,EACP,SAAS,oDACV;IAED,6CAA6C;KAC3C,oBAAoB;KACpB,6CAA6C;MAC3C,oBAAoB;MACpB,6CAA6C,EAC3C,oBAAoB,WACrB;MACF;KACF;IACF;GACF;EACD,SAAS;GACP,cAAc;GACd,UAAU;IACR,kBAAkB;IAClB,SAAS,EACP,SAAS,sCACV;IACD,uCAAuC;KACrC,SAAS,EACP,SAAS,sCACV;KACD,uCAAuC,EACrC,SAAS,EACP,SAAS,sCACV,EACF;KACF;IACF;GACF;EACF,EACF;CACF,CAAC;AAMF,MAAM,oBAAoB,OAAO,IAAI,IAAI,EAAE,EAAE,EAAE,eAAe,MAAM,CAAC;AAErE,MAAa,cAAc,YACxB,EAAE,SAAS,KAAK,SAAS,OAAO,GAAG,SAAS,QAAQ;CACnD,MAAM,YAAY,OAAO;CACzB,MAAM,QAAQ,eAET;EACC,WAAW,QAAQ,QAAQ,IAAI;EAC/B,kBAAkB,YAAY,YAAY,YAAY;EACvD,GACH;EAAC;EAAW;EAAO;EAAQ,CAC5B;AACD,QACE,oBAAC;EACC,mBAAgB;EAChB,gBAAc;EACP;EACP,MAAM,YAAY,YAAY,MAAM;EACpC,KAAK,IAAI,IAAI,kBAAkB,IAAI,EAAE,SAAS,CAAC,EAAE,QAAQ;EAClD;EACF;EACL,GAAI;GACJ;EAGP;AAID,MAAa,sBAAsB,OAAO,MAAM,EAC9C,MAAM;CACJ,WAAW;CACX,mBAAmB;CACnB,oBAAoB;CACpB,QAAQ,EACN,mBAAmB,KACpB;CACD,QAAQ;EACN,aAAa;EACb,oBAAoB;EACpB,SAAS,EACP,OAAO,eACR;EAED,UAAU,EACR,mBAAmB,gBACpB;EACF;CAED,eAAe;CACf,eAAe;EACb,eAAe;EACf,eAAe,EACb,eAAe,UAChB;EACF;CACF,EACF,CAAC;AAEF,MAAa,gBAAgB,YAAkD,OAAO,QAAQ;CAC5F,MAAM,YAAY,OAAO;AAUzB,QAAO,oBAAC;EAAyB;EAAK,OARxB,eAET,EACC,kBAAkB,WACnB,GACH,CAAC,UAAU,CACZ;EAEmD,GAAI;GAAS;EACjE;AAEF,MAAa,iBAAiB,OAAO,MAAM,EACzC,MAAM;CACJ,QAAQ,EACN,YAAY,QACb;CACD,QAAQ,EACN,mBAAmB,UACpB;CACF,EACF,CAAC"}
package/es/Image.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ark } from "@ark-ui/react";
2
2
  import { styled } from "@ndla/styled-system/jsx";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
- import { forwardRef } from "react";
4
+ import { forwardRef, useEffect, useState } from "react";
5
5
 
6
6
  //#region src/Image.tsx
7
7
  /**
@@ -113,6 +113,15 @@ const Img = forwardRef(({ fallbackWidth = FALLBACK_WIDTH, crop, focalPoint, imag
113
113
  });
114
114
  });
115
115
  const Image = forwardRef(({ srcSet: srcSetProp, crop, focalPoint, src, contentType, imageLanguage, fallbackWidth = FALLBACK_WIDTH, sizes: sizesProp, alt, fallbackElement, variants, ...props }, ref) => {
116
+ const [hasError, setHasError] = useState(false);
117
+ useEffect(() => {
118
+ setHasError(false);
119
+ }, [
120
+ src,
121
+ srcSetProp,
122
+ sizesProp,
123
+ variants
124
+ ]);
116
125
  if (!src?.length && !variants?.length && fallbackElement) return /* @__PURE__ */ jsx(StyledFallbackElement, {
117
126
  ...props,
118
127
  ref,
@@ -145,7 +154,16 @@ const Image = forwardRef(({ srcSet: srcSetProp, crop, focalPoint, src, contentTy
145
154
  alt,
146
155
  src: contentType === "image/gif" ? src : fallbackSrc,
147
156
  ...props,
148
- ref
157
+ ref,
158
+ "data-error": hasError ? "" : void 0,
159
+ onError: (e) => {
160
+ setHasError(true);
161
+ props.onError?.(e);
162
+ },
163
+ onLoad: (e) => {
164
+ setHasError(false);
165
+ props.onLoad?.(e);
166
+ }
149
167
  })
150
168
  ] });
151
169
  });
package/es/Image.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Image.mjs","names":[],"sources":["../src/Image.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type ComponentPropsWithRef, type ReactNode, forwardRef } from \"react\";\nimport { ark } from \"@ark-ui/react\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { StyledProps, StyledVariantProps } from \"@ndla/styled-system/types\";\nimport type { ImageVariantDTO, ImageVariantSize } from \"@ndla/types-backend/image-api\";\n\nexport interface ImageCrop {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\nexport interface ImageFocalPoint {\n x: number;\n y: number;\n}\n\ninterface SrcQueryStringOptions {\n width?: number;\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n}\n\nexport const makeSrcQueryString = ({ width, crop, focalPoint, imageLanguage }: SrcQueryStringOptions) => {\n const params = [];\n if (width) {\n params.push(`width=${width}`);\n }\n if (crop) {\n params.push(`cropStartX=${crop.startX}&cropEndX=${crop.endX}&cropStartY=${crop.startY}&cropEndY=${crop.endY}`);\n }\n if (focalPoint) {\n params.push(`focalX=${focalPoint.x}&focalY=${focalPoint.y}`);\n }\n if (imageLanguage) {\n params.push(`language=${imageLanguage}`);\n }\n return params.join(\"&\");\n};\n\ninterface SrcSetOptions {\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n src?: string;\n}\n\nexport const VAR_WIDTHS: Record<ImageVariantSize, number> = {\n icon: 240,\n xsmall: 480,\n small: 800,\n medium: 1080,\n large: 1440,\n xlarge: 1920,\n xxlarge: 2560,\n};\n\nconst IMAGE_WIDTHS = [2720, 2080, 1760, 1440, 1120, 1000, 960, 800, 640, 480, 320, 240, 180];\n\nexport const getVariantSrcSet = (variants: ImageVariantDTO[]) => {\n return variants\n .map((variant) => {\n return `${variant.variantUrl} ${VAR_WIDTHS[variant.size]}w`;\n })\n .join(\", \");\n};\n\nexport const getVariantSizes = (variants: ImageVariantDTO[]) => {\n return variants\n .map((variant, i) => {\n if (i === variants.length - 1) {\n return `${VAR_WIDTHS[variant.size]}px`;\n }\n return `(max-width: ${VAR_WIDTHS[variant.size]}px) ${VAR_WIDTHS[variant.size]}px`;\n })\n .join(\", \");\n};\n\nexport const getSrcSet = ({ src, crop, focalPoint, imageLanguage }: SrcSetOptions) => {\n if (!src) return undefined;\n return IMAGE_WIDTHS.map((width) => {\n const queryString = makeSrcQueryString({ width, crop, focalPoint, imageLanguage });\n const query = queryString.length ? `?${queryString}` : \"\";\n return `${src}${query} ${width}w`;\n }).join(\", \");\n};\n\nconst FALLBACK_WIDTH = 1024;\n\nconst FALLBACK_SIZES = \"(min-width: 1024px) 1024px, 100vw\";\n\nexport interface PictureProps extends StyledProps, ComponentPropsWithRef<\"picture\"> {\n src: string;\n sizes?: string;\n contentType?: string;\n srcSet?: string;\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n}\n\nexport const Picture = forwardRef<HTMLPictureElement, PictureProps>(\n (\n {\n children,\n srcSet: srcSetProp,\n crop,\n focalPoint,\n src,\n imageLanguage,\n contentType,\n sizes = FALLBACK_SIZES,\n ...props\n },\n ref,\n ) => {\n const srcSet = srcSetProp ?? getSrcSet({ src, crop, focalPoint, imageLanguage });\n\n return (\n <styled.picture {...props} ref={ref}>\n {contentType !== \"image/gif\" && <source type={contentType} srcSet={srcSet} sizes={sizes} />}\n {children}\n </styled.picture>\n );\n },\n);\n\nconst StyledImage = styled(\"img\", {\n defaultVariants: { variant: \"regular\" },\n variants: {\n variant: {\n regular: {},\n rounded: {\n borderRadius: \"xsmall\",\n },\n },\n },\n});\n\nconst StyledFallbackElement = styled(\n ark.div,\n {\n base: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n },\n { baseComponent: true },\n);\n\ntype ImageVariantProps = StyledVariantProps<typeof StyledImage>;\n\nexport interface ImgProps extends StyledProps, ComponentPropsWithRef<\"img\">, ImageVariantProps {\n alt: string;\n src: string;\n fallbackWidth?: number;\n contentType?: string;\n crop?: ImageCrop;\n imageLanguage?: string;\n focalPoint?: ImageFocalPoint;\n}\n\nexport const Img = forwardRef<HTMLImageElement, ImgProps>(\n ({ fallbackWidth = FALLBACK_WIDTH, crop, focalPoint, imageLanguage, contentType, src, alt, ...props }, ref) => {\n const queryString = makeSrcQueryString({ width: fallbackWidth, crop, focalPoint, imageLanguage });\n const srcWithParms = queryString ? `${src}?${queryString}` : src;\n return <StyledImage alt={alt} src={contentType === \"image/gif\" ? src : srcWithParms} {...props} ref={ref} />;\n },\n);\n\nexport interface ImageProps extends StyledProps, ComponentPropsWithRef<\"img\">, ImageVariantProps {\n alt: string;\n src?: string;\n sizes?: string;\n fallbackWidth?: number;\n contentType?: string;\n imageLanguage?: string;\n crop?: ImageCrop;\n fallbackElement?: ReactNode;\n focalPoint?: ImageFocalPoint;\n variants?: ImageVariantDTO[];\n}\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n (\n {\n srcSet: srcSetProp,\n crop,\n focalPoint,\n src,\n contentType,\n imageLanguage,\n fallbackWidth = FALLBACK_WIDTH,\n sizes: sizesProp,\n alt,\n fallbackElement,\n variants,\n ...props\n },\n ref,\n ) => {\n if (!src?.length && !variants?.length && fallbackElement) {\n return (\n <StyledFallbackElement {...props} ref={ref}>\n {fallbackElement}\n </StyledFallbackElement>\n );\n }\n\n const queryString = makeSrcQueryString({ width: fallbackWidth, crop, focalPoint, imageLanguage });\n const fallbackSrc = src && queryString ? `${src}?${queryString}` : src;\n\n return (\n <picture>\n {!!variants?.length && !crop && !focalPoint && contentType !== \"image/gif\" && (\n <source\n type={\"image/webp\"}\n srcSet={getVariantSrcSet(variants)}\n sizes={sizesProp ?? getVariantSizes(variants)}\n />\n )}\n {contentType !== \"image/gif\" && (\n <source\n type={contentType}\n srcSet={getSrcSet({ src, crop, focalPoint, imageLanguage })}\n sizes={sizesProp ?? FALLBACK_SIZES}\n />\n )}\n <StyledImage alt={alt} src={contentType === \"image/gif\" ? src : fallbackSrc} {...props} ref={ref} />\n </picture>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;AAiCA,MAAa,sBAAsB,EAAE,OAAO,MAAM,YAAY,oBAA2C;CACvG,MAAM,SAAS,EAAE;AACjB,KAAI,MACF,QAAO,KAAK,SAAS,QAAQ;AAE/B,KAAI,KACF,QAAO,KAAK,cAAc,KAAK,OAAO,YAAY,KAAK,KAAK,cAAc,KAAK,OAAO,YAAY,KAAK,OAAO;AAEhH,KAAI,WACF,QAAO,KAAK,UAAU,WAAW,EAAE,UAAU,WAAW,IAAI;AAE9D,KAAI,cACF,QAAO,KAAK,YAAY,gBAAgB;AAE1C,QAAO,OAAO,KAAK,IAAI;;AAUzB,MAAa,aAA+C;CAC1D,MAAM;CACN,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,SAAS;CACV;AAED,MAAM,eAAe;CAAC;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAI;AAE5F,MAAa,oBAAoB,aAAgC;AAC/D,QAAO,SACJ,KAAK,YAAY;AAChB,SAAO,GAAG,QAAQ,WAAW,GAAG,WAAW,QAAQ,MAAM;GACzD,CACD,KAAK,KAAK;;AAGf,MAAa,mBAAmB,aAAgC;AAC9D,QAAO,SACJ,KAAK,SAAS,MAAM;AACnB,MAAI,MAAM,SAAS,SAAS,EAC1B,QAAO,GAAG,WAAW,QAAQ,MAAM;AAErC,SAAO,eAAe,WAAW,QAAQ,MAAM,MAAM,WAAW,QAAQ,MAAM;GAC9E,CACD,KAAK,KAAK;;AAGf,MAAa,aAAa,EAAE,KAAK,MAAM,YAAY,oBAAmC;AACpF,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,aAAa,KAAK,UAAU;EACjC,MAAM,cAAc,mBAAmB;GAAE;GAAO;GAAM;GAAY;GAAe,CAAC;AAElF,SAAO,GAAG,MADI,YAAY,SAAS,IAAI,gBAAgB,GACjC,GAAG,MAAM;GAC/B,CAAC,KAAK,KAAK;;AAGf,MAAM,iBAAiB;AAEvB,MAAM,iBAAiB;AAYvB,MAAa,UAAU,YAEnB,EACE,UACA,QAAQ,YACR,MACA,YACA,KACA,eACA,aACA,QAAQ,gBACR,GAAG,SAEL,QACG;CACH,MAAM,SAAS,cAAc,UAAU;EAAE;EAAK;EAAM;EAAY;EAAe,CAAC;AAEhF,QACE,qBAAC,OAAO;EAAQ,GAAI;EAAY;aAC7B,gBAAgB,eAAe,oBAAC;GAAO,MAAM;GAAqB;GAAe;IAAS,EAC1F;GACc;EAGtB;AAED,MAAM,cAAc,OAAO,OAAO;CAChC,iBAAiB,EAAE,SAAS,WAAW;CACvC,UAAU,EACR,SAAS;EACP,SAAS,EAAE;EACX,SAAS,EACP,cAAc,UACf;EACF,EACF;CACF,CAAC;AAEF,MAAM,wBAAwB,OAC5B,IAAI,KACJ,EACE,MAAM;CACJ,SAAS;CACT,YAAY;CACZ,gBAAgB;CACjB,EACF,EACD,EAAE,eAAe,MAAM,CACxB;AAcD,MAAa,MAAM,YAChB,EAAE,gBAAgB,gBAAgB,MAAM,YAAY,eAAe,aAAa,KAAK,KAAK,GAAG,SAAS,QAAQ;CAC7G,MAAM,cAAc,mBAAmB;EAAE,OAAO;EAAe;EAAM;EAAY;EAAe,CAAC;CACjG,MAAM,eAAe,cAAc,GAAG,IAAI,GAAG,gBAAgB;AAC7D,QAAO,oBAAC;EAAiB;EAAK,KAAK,gBAAgB,cAAc,MAAM;EAAc,GAAI;EAAY;GAAO;EAE/G;AAeD,MAAa,QAAQ,YAEjB,EACE,QAAQ,YACR,MACA,YACA,KACA,aACA,eACA,gBAAgB,gBAChB,OAAO,WACP,KACA,iBACA,UACA,GAAG,SAEL,QACG;AACH,KAAI,CAAC,KAAK,UAAU,CAAC,UAAU,UAAU,gBACvC,QACE,oBAAC;EAAsB,GAAI;EAAY;YACpC;GACqB;CAI5B,MAAM,cAAc,mBAAmB;EAAE,OAAO;EAAe;EAAM;EAAY;EAAe,CAAC;CACjG,MAAM,cAAc,OAAO,cAAc,GAAG,IAAI,GAAG,gBAAgB;AAEnE,QACE,qBAAC;EACE,CAAC,CAAC,UAAU,UAAU,CAAC,QAAQ,CAAC,cAAc,gBAAgB,eAC7D,oBAAC;GACC,MAAM;GACN,QAAQ,iBAAiB,SAAS;GAClC,OAAO,aAAa,gBAAgB,SAAS;IAC7C;EAEH,gBAAgB,eACf,oBAAC;GACC,MAAM;GACN,QAAQ,UAAU;IAAE;IAAK;IAAM;IAAY;IAAe,CAAC;GAC3D,OAAO,aAAa;IACpB;EAEJ,oBAAC;GAAiB;GAAK,KAAK,gBAAgB,cAAc,MAAM;GAAa,GAAI;GAAY;IAAO;KAC5F;EAGf"}
1
+ {"version":3,"file":"Image.mjs","names":[],"sources":["../src/Image.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type ComponentPropsWithRef, type ReactNode, forwardRef, useEffect, useState } from \"react\";\nimport { ark } from \"@ark-ui/react\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { StyledProps, StyledVariantProps } from \"@ndla/styled-system/types\";\nimport type { ImageVariantDTO, ImageVariantSize } from \"@ndla/types-backend/image-api\";\n\nexport interface ImageCrop {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\nexport interface ImageFocalPoint {\n x: number;\n y: number;\n}\n\ninterface SrcQueryStringOptions {\n width?: number;\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n}\n\nexport const makeSrcQueryString = ({ width, crop, focalPoint, imageLanguage }: SrcQueryStringOptions) => {\n const params = [];\n if (width) {\n params.push(`width=${width}`);\n }\n if (crop) {\n params.push(`cropStartX=${crop.startX}&cropEndX=${crop.endX}&cropStartY=${crop.startY}&cropEndY=${crop.endY}`);\n }\n if (focalPoint) {\n params.push(`focalX=${focalPoint.x}&focalY=${focalPoint.y}`);\n }\n if (imageLanguage) {\n params.push(`language=${imageLanguage}`);\n }\n return params.join(\"&\");\n};\n\ninterface SrcSetOptions {\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n src?: string;\n}\n\nexport const VAR_WIDTHS: Record<ImageVariantSize, number> = {\n icon: 240,\n xsmall: 480,\n small: 800,\n medium: 1080,\n large: 1440,\n xlarge: 1920,\n xxlarge: 2560,\n};\n\nconst IMAGE_WIDTHS = [2720, 2080, 1760, 1440, 1120, 1000, 960, 800, 640, 480, 320, 240, 180];\n\nexport const getVariantSrcSet = (variants: ImageVariantDTO[]) => {\n return variants\n .map((variant) => {\n return `${variant.variantUrl} ${VAR_WIDTHS[variant.size]}w`;\n })\n .join(\", \");\n};\n\nexport const getVariantSizes = (variants: ImageVariantDTO[]) => {\n return variants\n .map((variant, i) => {\n if (i === variants.length - 1) {\n return `${VAR_WIDTHS[variant.size]}px`;\n }\n return `(max-width: ${VAR_WIDTHS[variant.size]}px) ${VAR_WIDTHS[variant.size]}px`;\n })\n .join(\", \");\n};\n\nexport const getSrcSet = ({ src, crop, focalPoint, imageLanguage }: SrcSetOptions) => {\n if (!src) return undefined;\n return IMAGE_WIDTHS.map((width) => {\n const queryString = makeSrcQueryString({ width, crop, focalPoint, imageLanguage });\n const query = queryString.length ? `?${queryString}` : \"\";\n return `${src}${query} ${width}w`;\n }).join(\", \");\n};\n\nconst FALLBACK_WIDTH = 1024;\n\nconst FALLBACK_SIZES = \"(min-width: 1024px) 1024px, 100vw\";\n\nexport interface PictureProps extends StyledProps, ComponentPropsWithRef<\"picture\"> {\n src: string;\n sizes?: string;\n contentType?: string;\n srcSet?: string;\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n}\n\nexport const Picture = forwardRef<HTMLPictureElement, PictureProps>(\n (\n {\n children,\n srcSet: srcSetProp,\n crop,\n focalPoint,\n src,\n imageLanguage,\n contentType,\n sizes = FALLBACK_SIZES,\n ...props\n },\n ref,\n ) => {\n const srcSet = srcSetProp ?? getSrcSet({ src, crop, focalPoint, imageLanguage });\n\n return (\n <styled.picture {...props} ref={ref}>\n {contentType !== \"image/gif\" && <source type={contentType} srcSet={srcSet} sizes={sizes} />}\n {children}\n </styled.picture>\n );\n },\n);\n\nconst StyledImage = styled(\"img\", {\n defaultVariants: { variant: \"regular\" },\n variants: {\n variant: {\n regular: {},\n rounded: {\n borderRadius: \"xsmall\",\n },\n },\n },\n});\n\nconst StyledFallbackElement = styled(\n ark.div,\n {\n base: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n },\n { baseComponent: true },\n);\n\ntype ImageVariantProps = StyledVariantProps<typeof StyledImage>;\n\nexport interface ImgProps extends StyledProps, ComponentPropsWithRef<\"img\">, ImageVariantProps {\n alt: string;\n src: string;\n fallbackWidth?: number;\n contentType?: string;\n crop?: ImageCrop;\n imageLanguage?: string;\n focalPoint?: ImageFocalPoint;\n}\n\nexport const Img = forwardRef<HTMLImageElement, ImgProps>(\n ({ fallbackWidth = FALLBACK_WIDTH, crop, focalPoint, imageLanguage, contentType, src, alt, ...props }, ref) => {\n const queryString = makeSrcQueryString({ width: fallbackWidth, crop, focalPoint, imageLanguage });\n const srcWithParms = queryString ? `${src}?${queryString}` : src;\n return <StyledImage alt={alt} src={contentType === \"image/gif\" ? src : srcWithParms} {...props} ref={ref} />;\n },\n);\n\nexport interface ImageProps extends StyledProps, ComponentPropsWithRef<\"img\">, ImageVariantProps {\n alt: string;\n src?: string;\n sizes?: string;\n fallbackWidth?: number;\n contentType?: string;\n imageLanguage?: string;\n crop?: ImageCrop;\n fallbackElement?: ReactNode;\n focalPoint?: ImageFocalPoint;\n variants?: ImageVariantDTO[];\n}\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n (\n {\n srcSet: srcSetProp,\n crop,\n focalPoint,\n src,\n contentType,\n imageLanguage,\n fallbackWidth = FALLBACK_WIDTH,\n sizes: sizesProp,\n alt,\n fallbackElement,\n variants,\n ...props\n },\n ref,\n ) => {\n const [hasError, setHasError] = useState(false);\n\n useEffect(() => {\n setHasError(false);\n }, [src, srcSetProp, sizesProp, variants]);\n\n if (!src?.length && !variants?.length && fallbackElement) {\n return (\n <StyledFallbackElement {...props} ref={ref}>\n {fallbackElement}\n </StyledFallbackElement>\n );\n }\n\n const queryString = makeSrcQueryString({ width: fallbackWidth, crop, focalPoint, imageLanguage });\n const fallbackSrc = src && queryString ? `${src}?${queryString}` : src;\n\n return (\n <picture>\n {!!variants?.length && !crop && !focalPoint && contentType !== \"image/gif\" && (\n <source\n type={\"image/webp\"}\n srcSet={getVariantSrcSet(variants)}\n sizes={sizesProp ?? getVariantSizes(variants)}\n />\n )}\n {contentType !== \"image/gif\" && (\n <source\n type={contentType}\n srcSet={getSrcSet({ src, crop, focalPoint, imageLanguage })}\n sizes={sizesProp ?? FALLBACK_SIZES}\n />\n )}\n <StyledImage\n alt={alt}\n src={contentType === \"image/gif\" ? src : fallbackSrc}\n {...props}\n ref={ref}\n data-error={hasError ? \"\" : undefined}\n onError={(e) => {\n setHasError(true);\n props.onError?.(e);\n }}\n onLoad={(e) => {\n setHasError(false);\n props.onLoad?.(e);\n }}\n />\n </picture>\n );\n },\n);\n"],"mappings":"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"}
@@ -10,81 +10,44 @@ import type { HTMLStyledProps, RecipeVariantProps, StyledProps } from "@ndla/sty
10
10
  declare const orderedListRecipe: import("@ndla/styled-system/types").RecipeRuntimeFn<{
11
11
  variant: {
12
12
  numbers: {
13
- "& > ol:not([data-variant='letters'])": {
14
- marginInlineStart: "0";
15
- paddingInlineStart: "0";
16
- };
17
- counterReset: "level1";
18
- "&[data-count='true']": {
19
- counterReset: "level1 var(--start, 0)";
20
- };
13
+ /** We utilize a CSS variable for the counter name to correctly reset counters when nested inside a letter list.
14
+ * This way, the nested number list won't pick up on any other counters named "numbers" higher up in the DOM tree.
15
+ * This fixes the following scenario
16
+ * ol (numbers) -> 1.
17
+ * ol(letters) -> A.
18
+ * ol (numbers) -> 1. (Without the CSS variable, this would be 1.1)
19
+ */
20
+ counterReset: "var(--counter-name, numbers) var(--start, 0)";
21
21
  "& > li": {
22
- counterIncrement: "level1";
22
+ counterIncrement: "var(--counter-name, numbers)";
23
23
  _before: {
24
- content: "counter(level1, decimal) '. '";
24
+ content: "counters(var(--counter-name, numbers), \".\") \". \"";
25
25
  };
26
- "& > ol:not([data-variant='letters'])": {
27
- counterReset: "level2";
28
- "&[data-count='true']": {
29
- counterReset: "level2 var(--start, 0)";
30
- };
31
- "& > li": {
32
- marginInlineStart: "small";
33
- counterIncrement: "level2";
34
- _before: {
35
- content: "counter(level1, decimal) '.' counter(level2, decimal) '. '";
36
- };
37
- "& > ol:not([data-variant='letters'])": {
38
- counterReset: "level3";
39
- "&[data-count='true']": {
40
- counterReset: "level3 var(--start, 0)";
41
- };
42
- "& > li": {
43
- marginInlineStart: "calc(1.5ch + token(spacing.small))";
44
- counterIncrement: "level3";
45
- _before: {
46
- content: "counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '. '";
47
- };
48
- "& > ol:not([data-variant='letters'])": {
49
- counterReset: "level4";
50
- "&[data-count='true']": {
51
- counterReset: "level4 var(--start, 0)";
52
- };
53
- "& > li": {
54
- marginInlineStart: "calc(3ch + token(spacing.small))";
55
- counterIncrement: "level4";
56
- _before: {
57
- content: "counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.' counter(level4, decimal) '. '";
58
- };
59
- };
60
- };
61
- };
26
+ "& > ol:not([data-variant='letters']) > li": {
27
+ paddingInlineStart: "small";
28
+ "& > ol:not([data-variant='letters']) > li": {
29
+ paddingInlineStart: "large";
30
+ "& > ol:not([data-variant='letters']) > li": {
31
+ paddingInlineStart: "xxlarge";
62
32
  };
63
33
  };
64
34
  };
65
35
  };
66
36
  };
67
37
  letters: {
68
- counterReset: "level1";
69
- "&[data-count='true']": {
70
- counterReset: "level1 var(--start, 0)";
71
- };
72
- "& > ol[data-variant='letters']": {
73
- marginInlineStart: "0";
74
- paddingInlineStart: "0";
75
- };
38
+ counterReset: "letters var(--start, 0)";
76
39
  "& > li": {
77
- counterIncrement: "level1";
40
+ counterIncrement: "letters";
78
41
  _before: {
79
- content: "counter(level1, upper-alpha) '. '";
42
+ content: "counter(letters, upper-alpha) \". \"";
80
43
  };
81
44
  "& > ol[data-variant='letters'] > li": {
82
45
  _before: {
83
- content: "counter(level1, lower-alpha) '. '";
46
+ content: "counter(letters, lower-alpha) \". \"";
84
47
  };
85
48
  "& > ol[data-variant='letters'] > li": {
86
49
  _before: {
87
- content: "counter(level1, lower-roman) '. '";
50
+ content: "counter(letters, lower-roman) \". \"";
88
51
  };
89
52
  };
90
53
  };
@@ -98,7 +61,8 @@ export interface OrderedListProps extends StyledProps, HTMLArkProps<"ol">, Order
98
61
  export declare const OrderedList: import("react").ForwardRefExoticComponent<OrderedListProps & import("react").RefAttributes<HTMLOListElement>>;
99
62
  export interface UnOrderedListProps extends StyledProps, HTMLArkProps<"ul"> {
100
63
  }
101
- export declare const UnOrderedList: import("@ndla/styled-system/types").StyledComponent<"ul", {}>;
64
+ export declare const StyledUnOrderedList: import("@ndla/styled-system/types").StyledComponent<"ul", {}>;
65
+ export declare const UnOrderedList: import("react").ForwardRefExoticComponent<UnOrderedListProps & import("react").RefAttributes<HTMLUListElement>>;
102
66
  export declare const DefinitionList: import("@ndla/styled-system/types").StyledComponent<"dl", {}>;
103
67
  export type DefinitionListProps = HTMLStyledProps<"dl">;
104
68
  export {};
@@ -12,78 +12,42 @@ let react = require("react");
12
12
  * LICENSE file in the root directory of this source tree.
13
13
  *
14
14
  */
15
- const LIST_ITEM = "& > li";
16
- const LETTER_LIST = "& > ol[data-variant='letters']";
17
- const NUMBER_LIST = "& > ol:not([data-variant='letters'])";
18
- const LETTER_LIST_ITEM = `${LETTER_LIST} > li`;
19
15
  const orderedListRecipe = (0, _ndla_styled_system_css.cva)({
20
16
  base: {
21
- marginInlineStart: "small",
22
- paddingInlineStart: "small",
23
- [LIST_ITEM]: {
24
- "& > ul": { marginInlineStart: "0 !important" },
17
+ paddingInlineStart: "large",
18
+ "& > li": {
19
+ marginBlock: "small",
25
20
  _before: {
26
21
  position: "absolute",
27
- transform: "translateX(calc(-100% + (token(spacing.small) * -1)))",
22
+ transform: "translateX(calc(-100% - token(spacing.small)))",
28
23
  fontVariantNumeric: "tabular-nums"
29
24
  }
30
- },
31
- "& li": { marginBlock: "small" }
25
+ }
32
26
  },
33
27
  defaultVariants: { variant: "numbers" },
34
28
  variants: { variant: {
35
29
  numbers: {
36
- [NUMBER_LIST]: {
37
- marginInlineStart: "0",
38
- paddingInlineStart: "0"
39
- },
40
- counterReset: "level1",
41
- "&[data-count='true']": { counterReset: "level1 var(--start, 0)" },
42
- [LIST_ITEM]: {
43
- counterIncrement: "level1",
44
- _before: { content: "counter(level1, decimal) '. '" },
45
- [NUMBER_LIST]: {
46
- counterReset: "level2",
47
- "&[data-count='true']": { counterReset: "level2 var(--start, 0)" },
48
- [LIST_ITEM]: {
49
- marginInlineStart: "small",
50
- counterIncrement: "level2",
51
- _before: { content: "counter(level1, decimal) '.' counter(level2, decimal) '. '" },
52
- [NUMBER_LIST]: {
53
- counterReset: "level3",
54
- "&[data-count='true']": { counterReset: "level3 var(--start, 0)" },
55
- [LIST_ITEM]: {
56
- marginInlineStart: "calc(1.5ch + token(spacing.small))",
57
- counterIncrement: "level3",
58
- _before: { content: "counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '. '" },
59
- [NUMBER_LIST]: {
60
- counterReset: "level4",
61
- "&[data-count='true']": { counterReset: "level4 var(--start, 0)" },
62
- [LIST_ITEM]: {
63
- marginInlineStart: "calc(3ch + token(spacing.small))",
64
- counterIncrement: "level4",
65
- _before: { content: "counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.' counter(level4, decimal) '. '" }
66
- }
67
- }
68
- }
69
- }
30
+ counterReset: "var(--counter-name, numbers) var(--start, 0)",
31
+ "& > li": {
32
+ counterIncrement: "var(--counter-name, numbers)",
33
+ _before: { content: `counters(var(--counter-name, numbers), ".") ". "` },
34
+ "& > ol:not([data-variant='letters']) > li": {
35
+ paddingInlineStart: "small",
36
+ "& > ol:not([data-variant='letters']) > li": {
37
+ paddingInlineStart: "large",
38
+ "& > ol:not([data-variant='letters']) > li": { paddingInlineStart: "xxlarge" }
70
39
  }
71
40
  }
72
41
  }
73
42
  },
74
43
  letters: {
75
- counterReset: "level1",
76
- "&[data-count='true']": { counterReset: "level1 var(--start, 0)" },
77
- [LETTER_LIST]: {
78
- marginInlineStart: "0",
79
- paddingInlineStart: "0"
80
- },
81
- [LIST_ITEM]: {
82
- counterIncrement: "level1",
83
- _before: { content: "counter(level1, upper-alpha) '. '" },
84
- [LETTER_LIST_ITEM]: {
85
- _before: { content: "counter(level1, lower-alpha) '. '" },
86
- [LETTER_LIST_ITEM]: { _before: { content: "counter(level1, lower-roman) '. '" } }
44
+ counterReset: "letters var(--start, 0)",
45
+ "& > li": {
46
+ counterIncrement: "letters",
47
+ _before: { content: `counter(letters, upper-alpha) ". "` },
48
+ "& > ol[data-variant='letters'] > li": {
49
+ _before: { content: `counter(letters, lower-alpha) ". "` },
50
+ "& > ol[data-variant='letters'] > li": { _before: { content: `counter(letters, lower-roman) ". "` } }
87
51
  }
88
52
  }
89
53
  }
@@ -91,18 +55,27 @@ const orderedListRecipe = (0, _ndla_styled_system_css.cva)({
91
55
  });
92
56
  const StyledOrderedList = (0, _ndla_styled_system_jsx.styled)(_ark_ui_react.ark.ol, {}, { baseComponent: true });
93
57
  const OrderedList = (0, react.forwardRef)(({ variant, css: cssProp, start, ...props }, ref) => {
94
- const style = (0, react.useMemo)(() => ({ "--start": start ? start - 1 : void 0 }), [start]);
58
+ const counterId = (0, react.useId)();
59
+ const style = (0, react.useMemo)(() => ({
60
+ "--start": start ? start - 1 : 0,
61
+ "--counter-name": variant === "letters" ? counterId : void 0
62
+ }), [
63
+ counterId,
64
+ start,
65
+ variant
66
+ ]);
95
67
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StyledOrderedList, {
96
68
  "data-embed-type": "ordered-list",
97
69
  "data-variant": variant,
98
- "data-count": start !== void 0,
70
+ start,
71
+ type: variant === "letters" ? "A" : void 0,
99
72
  css: _ndla_styled_system_css.css.raw(orderedListRecipe.raw({ variant }), cssProp),
100
73
  style,
101
74
  ref,
102
75
  ...props
103
76
  });
104
77
  });
105
- const UnOrderedList = (0, _ndla_styled_system_jsx.styled)("ul", { base: {
78
+ const StyledUnOrderedList = (0, _ndla_styled_system_jsx.styled)("ul", { base: {
106
79
  listStyle: "revert",
107
80
  marginInlineStart: "medium",
108
81
  paddingInlineStart: "small",
@@ -119,6 +92,14 @@ const UnOrderedList = (0, _ndla_styled_system_jsx.styled)("ul", { base: {
119
92
  "& > li > ul": { listStyleType: "square" }
120
93
  }
121
94
  } });
95
+ const UnOrderedList = (0, react.forwardRef)((props, ref) => {
96
+ const counterId = (0, react.useId)();
97
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StyledUnOrderedList, {
98
+ ref,
99
+ style: (0, react.useMemo)(() => ({ "--counter-name": counterId }), [counterId]),
100
+ ...props
101
+ });
102
+ });
122
103
  const DefinitionList = (0, _ndla_styled_system_jsx.styled)("dl", { base: {
123
104
  "& dt": { fontWeight: "bold" },
124
105
  "& dd": { marginInlineStart: "medium" }
@@ -1 +1 @@
1
- {"version":3,"file":"ArticleLists.js","names":["ark","css"],"sources":["../src/ArticleLists.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type CSSProperties, forwardRef, useMemo } from \"react\";\nimport { type HTMLArkProps, ark } from \"@ark-ui/react\";\nimport { css, cva } from \"@ndla/styled-system/css\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { HTMLStyledProps, RecipeVariantProps, StyledProps } from \"@ndla/styled-system/types\";\n\nconst LIST_ITEM = \"& > li\";\nconst LETTER_LIST = \"& > ol[data-variant='letters']\";\nconst NUMBER_LIST = \"& > ol:not([data-variant='letters'])\";\nconst LETTER_LIST_ITEM = `${LETTER_LIST} > li`;\n\nconst orderedListRecipe = cva({\n base: {\n marginInlineStart: \"small\",\n paddingInlineStart: \"small\",\n [LIST_ITEM]: {\n \"& > ul\": {\n marginInlineStart: \"0 !important\",\n },\n _before: {\n position: \"absolute\",\n transform: \"translateX(calc(-100% + (token(spacing.small) * -1)))\",\n fontVariantNumeric: \"tabular-nums\",\n },\n },\n \"& li\": {\n marginBlock: \"small\",\n },\n },\n defaultVariants: {\n variant: \"numbers\",\n },\n variants: {\n variant: {\n numbers: {\n [NUMBER_LIST]: {\n marginInlineStart: \"0\",\n paddingInlineStart: \"0\",\n },\n counterReset: \"level1\",\n \"&[data-count='true']\": {\n counterReset: \"level1 var(--start, 0)\",\n },\n [LIST_ITEM]: {\n counterIncrement: \"level1\",\n _before: {\n content: \"counter(level1, decimal) '. '\",\n },\n [NUMBER_LIST]: {\n counterReset: \"level2\",\n \"&[data-count='true']\": {\n counterReset: \"level2 var(--start, 0)\",\n },\n [LIST_ITEM]: {\n marginInlineStart: \"small\",\n counterIncrement: \"level2\",\n _before: {\n content: \"counter(level1, decimal) '.' counter(level2, decimal) '. '\",\n },\n [NUMBER_LIST]: {\n counterReset: \"level3\",\n \"&[data-count='true']\": {\n counterReset: \"level3 var(--start, 0)\",\n },\n [LIST_ITEM]: {\n marginInlineStart: \"calc(1.5ch + token(spacing.small))\",\n counterIncrement: \"level3\",\n _before: {\n content: \"counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '. '\",\n },\n [NUMBER_LIST]: {\n counterReset: \"level4\",\n \"&[data-count='true']\": {\n counterReset: \"level4 var(--start, 0)\",\n },\n [LIST_ITEM]: {\n marginInlineStart: \"calc(3ch + token(spacing.small))\",\n counterIncrement: \"level4\",\n _before: {\n content:\n \"counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.' counter(level4, decimal) '. '\",\n },\n },\n },\n },\n },\n },\n },\n },\n },\n letters: {\n counterReset: \"level1\",\n \"&[data-count='true']\": {\n counterReset: \"level1 var(--start, 0)\",\n },\n [LETTER_LIST]: {\n marginInlineStart: \"0\",\n paddingInlineStart: \"0\",\n },\n [LIST_ITEM]: {\n counterIncrement: \"level1\",\n _before: {\n content: \"counter(level1, upper-alpha) '. '\",\n },\n [LETTER_LIST_ITEM]: {\n _before: {\n content: \"counter(level1, lower-alpha) '. '\",\n },\n [LETTER_LIST_ITEM]: {\n _before: {\n content: \"counter(level1, lower-roman) '. '\",\n },\n },\n },\n },\n },\n },\n },\n});\n\nexport type OrderedListVariantProps = NonNullable<RecipeVariantProps<typeof orderedListRecipe>>;\n\nexport interface OrderedListProps extends StyledProps, HTMLArkProps<\"ol\">, OrderedListVariantProps {}\n\nconst StyledOrderedList = styled(ark.ol, {}, { baseComponent: true });\n\nexport const OrderedList = forwardRef<HTMLOListElement, OrderedListProps>(\n ({ variant, css: cssProp, start, ...props }, ref) => {\n const style = useMemo(() => ({ \"--start\": start ? start - 1 : undefined }) as CSSProperties, [start]);\n return (\n <StyledOrderedList\n data-embed-type=\"ordered-list\"\n data-variant={variant}\n data-count={start !== undefined}\n css={css.raw(orderedListRecipe.raw({ variant }), cssProp)}\n style={style}\n ref={ref}\n {...props}\n />\n );\n },\n);\n\nexport interface UnOrderedListProps extends StyledProps, HTMLArkProps<\"ul\"> {}\n\nexport const UnOrderedList = styled(\"ul\", {\n base: {\n listStyle: \"revert\",\n marginInlineStart: \"medium\",\n paddingInlineStart: \"small\",\n \"& ul\": {\n marginInlineStart: \"0\",\n },\n \"& li\": {\n marginBlock: \"small\",\n paddingInlineStart: \"small\",\n _marker: {\n color: \"icon.strong\",\n },\n\n \"& > ol\": {\n marginInlineStart: \"0 !important\",\n },\n },\n\n listStyleType: \"disc\",\n \"& > li > ul\": {\n listStyleType: \"circle\",\n \"& > li > ul\": {\n listStyleType: \"square\",\n },\n },\n },\n});\n\nexport const DefinitionList = styled(\"dl\", {\n base: {\n \"& dt\": {\n fontWeight: \"bold\",\n },\n \"& dd\": {\n marginInlineStart: \"medium\",\n },\n },\n});\n\nexport type DefinitionListProps = HTMLStyledProps<\"dl\">;\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,YAAY;AAClB,MAAM,cAAc;AACpB,MAAM,cAAc;AACpB,MAAM,mBAAmB,GAAG,YAAY;AAExC,MAAM,qDAAwB;CAC5B,MAAM;EACJ,mBAAmB;EACnB,oBAAoB;GACnB,YAAY;GACX,UAAU,EACR,mBAAmB,gBACpB;GACD,SAAS;IACP,UAAU;IACV,WAAW;IACX,oBAAoB;IACrB;GACF;EACD,QAAQ,EACN,aAAa,SACd;EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACD,UAAU,EACR,SAAS;EACP,SAAS;IACN,cAAc;IACb,mBAAmB;IACnB,oBAAoB;IACrB;GACD,cAAc;GACd,wBAAwB,EACtB,cAAc,0BACf;IACA,YAAY;IACX,kBAAkB;IAClB,SAAS,EACP,SAAS,iCACV;KACA,cAAc;KACb,cAAc;KACd,wBAAwB,EACtB,cAAc,0BACf;MACA,YAAY;MACX,mBAAmB;MACnB,kBAAkB;MAClB,SAAS,EACP,SAAS,8DACV;OACA,cAAc;OACb,cAAc;OACd,wBAAwB,EACtB,cAAc,0BACf;QACA,YAAY;QACX,mBAAmB;QACnB,kBAAkB;QAClB,SAAS,EACP,SAAS,2FACV;SACA,cAAc;SACb,cAAc;SACd,wBAAwB,EACtB,cAAc,0BACf;UACA,YAAY;UACX,mBAAmB;UACnB,kBAAkB;UAClB,SAAS,EACP,SACE,yHACH;UACF;SACF;QACF;OACF;MACF;KACF;IACF;GACF;EACD,SAAS;GACP,cAAc;GACd,wBAAwB,EACtB,cAAc,0BACf;IACA,cAAc;IACb,mBAAmB;IACnB,oBAAoB;IACrB;IACA,YAAY;IACX,kBAAkB;IAClB,SAAS,EACP,SAAS,qCACV;KACA,mBAAmB;KAClB,SAAS,EACP,SAAS,qCACV;MACA,mBAAmB,EAClB,SAAS,EACP,SAAS,qCACV,EACF;KACF;IACF;GACF;EACF,EACF;CACF,CAAC;AAMF,MAAM,wDAA2BA,kBAAI,IAAI,EAAE,EAAE,EAAE,eAAe,MAAM,CAAC;AAErE,MAAa,qCACV,EAAE,SAAS,KAAK,SAAS,OAAO,GAAG,SAAS,QAAQ;CACnD,MAAM,kCAAuB,EAAE,WAAW,QAAQ,QAAQ,IAAI,QAAW,GAAoB,CAAC,MAAM,CAAC;AACrG,QACE,2CAAC;EACC,mBAAgB;EAChB,gBAAc;EACd,cAAY,UAAU;EACtB,KAAKC,4BAAI,IAAI,kBAAkB,IAAI,EAAE,SAAS,CAAC,EAAE,QAAQ;EAClD;EACF;EACL,GAAI;GACJ;EAGP;AAID,MAAa,oDAAuB,MAAM,EACxC,MAAM;CACJ,WAAW;CACX,mBAAmB;CACnB,oBAAoB;CACpB,QAAQ,EACN,mBAAmB,KACpB;CACD,QAAQ;EACN,aAAa;EACb,oBAAoB;EACpB,SAAS,EACP,OAAO,eACR;EAED,UAAU,EACR,mBAAmB,gBACpB;EACF;CAED,eAAe;CACf,eAAe;EACb,eAAe;EACf,eAAe,EACb,eAAe,UAChB;EACF;CACF,EACF,CAAC;AAEF,MAAa,qDAAwB,MAAM,EACzC,MAAM;CACJ,QAAQ,EACN,YAAY,QACb;CACD,QAAQ,EACN,mBAAmB,UACpB;CACF,EACF,CAAC"}
1
+ {"version":3,"file":"ArticleLists.js","names":["ark","css"],"sources":["../src/ArticleLists.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type CSSProperties, forwardRef, useId, useMemo } from \"react\";\nimport { type HTMLArkProps, ark } from \"@ark-ui/react\";\nimport { css, cva } from \"@ndla/styled-system/css\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { HTMLStyledProps, RecipeVariantProps, StyledProps } from \"@ndla/styled-system/types\";\n\nconst orderedListRecipe = cva({\n base: {\n paddingInlineStart: \"large\",\n \"& > li\": {\n marginBlock: \"small\",\n _before: {\n position: \"absolute\",\n transform: \"translateX(calc(-100% - token(spacing.small)))\",\n fontVariantNumeric: \"tabular-nums\",\n },\n },\n },\n defaultVariants: {\n variant: \"numbers\",\n },\n variants: {\n variant: {\n numbers: {\n /** We utilize a CSS variable for the counter name to correctly reset counters when nested inside a letter list.\n * This way, the nested number list won't pick up on any other counters named \"numbers\" higher up in the DOM tree.\n * This fixes the following scenario\n * ol (numbers) -> 1.\n * ol(letters) -> A.\n * ol (numbers) -> 1. (Without the CSS variable, this would be 1.1)\n */\n counterReset: \"var(--counter-name, numbers) var(--start, 0)\",\n \"& > li\": {\n counterIncrement: \"var(--counter-name, numbers)\",\n _before: {\n content: `counters(var(--counter-name, numbers), \".\") \". \"`,\n },\n // If a nested OL is not a letters variant, it's a numbers variant. Keep increasing the margin to account for wider numbers.\n \"& > ol:not([data-variant='letters']) > li\": {\n paddingInlineStart: \"small\",\n \"& > ol:not([data-variant='letters']) > li\": {\n paddingInlineStart: \"large\",\n \"& > ol:not([data-variant='letters']) > li\": {\n paddingInlineStart: \"xxlarge\",\n },\n },\n },\n },\n },\n letters: {\n counterReset: \"letters var(--start, 0)\",\n \"& > li\": {\n counterIncrement: \"letters\",\n _before: {\n content: `counter(letters, upper-alpha) \". \"`,\n },\n \"& > ol[data-variant='letters'] > li\": {\n _before: {\n content: `counter(letters, lower-alpha) \". \"`,\n },\n \"& > ol[data-variant='letters'] > li\": {\n _before: {\n content: `counter(letters, lower-roman) \". \"`,\n },\n },\n },\n },\n },\n },\n },\n});\n\nexport type OrderedListVariantProps = NonNullable<RecipeVariantProps<typeof orderedListRecipe>>;\n\nexport interface OrderedListProps extends StyledProps, HTMLArkProps<\"ol\">, OrderedListVariantProps {}\n\nconst StyledOrderedList = styled(ark.ol, {}, { baseComponent: true });\n\nexport const OrderedList = forwardRef<HTMLOListElement, OrderedListProps>(\n ({ variant, css: cssProp, start, ...props }, ref) => {\n const counterId = useId();\n const style = useMemo(\n () =>\n ({\n \"--start\": start ? start - 1 : 0,\n \"--counter-name\": variant === \"letters\" ? counterId : undefined,\n }) as CSSProperties,\n [counterId, start, variant],\n );\n return (\n <StyledOrderedList\n data-embed-type=\"ordered-list\"\n data-variant={variant}\n start={start}\n type={variant === \"letters\" ? \"A\" : undefined}\n css={css.raw(orderedListRecipe.raw({ variant }), cssProp)}\n style={style}\n ref={ref}\n {...props}\n />\n );\n },\n);\n\nexport interface UnOrderedListProps extends StyledProps, HTMLArkProps<\"ul\"> {}\n\nexport const StyledUnOrderedList = styled(\"ul\", {\n base: {\n listStyle: \"revert\",\n marginInlineStart: \"medium\",\n paddingInlineStart: \"small\",\n \"& ul\": {\n marginInlineStart: \"0\",\n },\n \"& li\": {\n marginBlock: \"small\",\n paddingInlineStart: \"small\",\n _marker: {\n color: \"icon.strong\",\n },\n\n \"& > ol\": {\n marginInlineStart: \"0 !important\",\n },\n },\n\n listStyleType: \"disc\",\n \"& > li > ul\": {\n listStyleType: \"circle\",\n \"& > li > ul\": {\n listStyleType: \"square\",\n },\n },\n },\n});\n\nexport const UnOrderedList = forwardRef<HTMLUListElement, UnOrderedListProps>((props, ref) => {\n const counterId = useId();\n\n const style = useMemo(\n () =>\n ({\n \"--counter-name\": counterId,\n }) as CSSProperties,\n [counterId],\n );\n\n return <StyledUnOrderedList ref={ref} style={style} {...props} />;\n});\n\nexport const DefinitionList = styled(\"dl\", {\n base: {\n \"& dt\": {\n fontWeight: \"bold\",\n },\n \"& dd\": {\n marginInlineStart: \"medium\",\n },\n },\n});\n\nexport type DefinitionListProps = HTMLStyledProps<\"dl\">;\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,qDAAwB;CAC5B,MAAM;EACJ,oBAAoB;EACpB,UAAU;GACR,aAAa;GACb,SAAS;IACP,UAAU;IACV,WAAW;IACX,oBAAoB;IACrB;GACF;EACF;CACD,iBAAiB,EACf,SAAS,WACV;CACD,UAAU,EACR,SAAS;EACP,SAAS;GAQP,cAAc;GACd,UAAU;IACR,kBAAkB;IAClB,SAAS,EACP,SAAS,oDACV;IAED,6CAA6C;KAC3C,oBAAoB;KACpB,6CAA6C;MAC3C,oBAAoB;MACpB,6CAA6C,EAC3C,oBAAoB,WACrB;MACF;KACF;IACF;GACF;EACD,SAAS;GACP,cAAc;GACd,UAAU;IACR,kBAAkB;IAClB,SAAS,EACP,SAAS,sCACV;IACD,uCAAuC;KACrC,SAAS,EACP,SAAS,sCACV;KACD,uCAAuC,EACrC,SAAS,EACP,SAAS,sCACV,EACF;KACF;IACF;GACF;EACF,EACF;CACF,CAAC;AAMF,MAAM,wDAA2BA,kBAAI,IAAI,EAAE,EAAE,EAAE,eAAe,MAAM,CAAC;AAErE,MAAa,qCACV,EAAE,SAAS,KAAK,SAAS,OAAO,GAAG,SAAS,QAAQ;CACnD,MAAM,8BAAmB;CACzB,MAAM,kCAED;EACC,WAAW,QAAQ,QAAQ,IAAI;EAC/B,kBAAkB,YAAY,YAAY,YAAY;EACvD,GACH;EAAC;EAAW;EAAO;EAAQ,CAC5B;AACD,QACE,2CAAC;EACC,mBAAgB;EAChB,gBAAc;EACP;EACP,MAAM,YAAY,YAAY,MAAM;EACpC,KAAKC,4BAAI,IAAI,kBAAkB,IAAI,EAAE,SAAS,CAAC,EAAE,QAAQ;EAClD;EACF;EACL,GAAI;GACJ;EAGP;AAID,MAAa,0DAA6B,MAAM,EAC9C,MAAM;CACJ,WAAW;CACX,mBAAmB;CACnB,oBAAoB;CACpB,QAAQ,EACN,mBAAmB,KACpB;CACD,QAAQ;EACN,aAAa;EACb,oBAAoB;EACpB,SAAS,EACP,OAAO,eACR;EAED,UAAU,EACR,mBAAmB,gBACpB;EACF;CAED,eAAe;CACf,eAAe;EACb,eAAe;EACf,eAAe,EACb,eAAe,UAChB;EACF;CACF,EACF,CAAC;AAEF,MAAa,uCAAkE,OAAO,QAAQ;CAC5F,MAAM,8BAAmB;AAUzB,QAAO,2CAAC;EAAyB;EAAK,iCANjC,EACC,kBAAkB,WACnB,GACH,CAAC,UAAU,CACZ;EAEmD,GAAI;GAAS;EACjE;AAEF,MAAa,qDAAwB,MAAM,EACzC,MAAM;CACJ,QAAQ,EACN,YAAY,QACb;CACD,QAAQ,EACN,mBAAmB,UACpB;CACF,EACF,CAAC"}
package/lib/Combobox.d.ts CHANGED
@@ -9,7 +9,7 @@ import { type RefAttributes } from "react";
9
9
  import { Combobox } from "@ark-ui/react";
10
10
  import type { RecipeVariantProps, StyledProps } from "@ndla/styled-system/types";
11
11
  import { type TextProps } from "./Text";
12
- declare const comboboxRecipe: import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "item" | "itemIndicator" | "content" | "input" | "label" | "list" | "control" | "trigger" | "positioner" | "clearTrigger" | "itemGroup" | "itemGroupLabel" | "itemText" | "empty", {
12
+ declare const comboboxRecipe: import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "item" | "itemIndicator" | "content" | "input" | "label" | "list" | "control" | "itemGroup" | "trigger" | "positioner" | "clearTrigger" | "itemGroupLabel" | "itemText" | "empty", {
13
13
  context: {
14
14
  standalone: {
15
15
  content: {
@@ -13,7 +13,7 @@ export interface DatePickerRootProps extends DatePicker.RootProps, StyledProps {
13
13
  translations: DatePicker.RootProps["translations"];
14
14
  locale: DatePicker.RootProps["locale"];
15
15
  }
16
- export declare const DatePickerRoot: import("@ndla/styled-system/jsx").StyleContextProvider<import("react").ForwardRefExoticComponent<DatePicker.RootProps & RefAttributes<HTMLDivElement>>, import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "content" | "table" | "input" | "label" | "view" | "control" | "trigger" | "positioner" | "clearTrigger" | "monthSelect" | "nextTrigger" | "presetTrigger" | "prevTrigger" | "rangeText" | "tableBody" | "tableCell" | "tableCellTrigger" | "tableHead" | "tableHeader" | "tableRow" | "viewControl" | "viewTrigger" | "yearSelect", import("@ndla/styled-system/types").SlotRecipeVariantRecord<"root" | "content" | "table" | "input" | "label" | "view" | "control" | "trigger" | "positioner" | "clearTrigger" | "monthSelect" | "nextTrigger" | "presetTrigger" | "prevTrigger" | "rangeText" | "tableBody" | "tableCell" | "tableCellTrigger" | "tableHead" | "tableHeader" | "tableRow" | "viewControl" | "viewTrigger" | "yearSelect">>>;
16
+ export declare const DatePickerRoot: import("@ndla/styled-system/jsx").StyleContextProvider<import("react").ForwardRefExoticComponent<DatePicker.RootProps & RefAttributes<HTMLDivElement>>, import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "content" | "table" | "input" | "label" | "view" | "control" | "trigger" | "positioner" | "clearTrigger" | "nextTrigger" | "prevTrigger" | "monthSelect" | "presetTrigger" | "rangeText" | "tableBody" | "tableCell" | "tableCellTrigger" | "tableHead" | "tableHeader" | "tableRow" | "viewControl" | "viewTrigger" | "yearSelect", import("@ndla/styled-system/types").SlotRecipeVariantRecord<"root" | "content" | "table" | "input" | "label" | "view" | "control" | "trigger" | "positioner" | "clearTrigger" | "nextTrigger" | "prevTrigger" | "monthSelect" | "presetTrigger" | "rangeText" | "tableBody" | "tableCell" | "tableCellTrigger" | "tableHead" | "tableHeader" | "tableRow" | "viewControl" | "viewTrigger" | "yearSelect">>>;
17
17
  export declare const DatePickerClearTrigger: import("@ndla/styled-system/jsx").StyleContextConsumer<import("react").ForwardRefExoticComponent<DatePicker.ClearTriggerProps & RefAttributes<HTMLButtonElement>>>;
18
18
  interface DatePickerContentProps extends DatePicker.ContentProps, StyledProps {
19
19
  }
@@ -10,13 +10,13 @@ import { FileUpload } from "@ark-ui/react";
10
10
  import { type RecipeVariantProps } from "@ndla/styled-system/css";
11
11
  import type { StyledProps } from "@ndla/styled-system/types";
12
12
  import { type TextProps } from "./Text";
13
- declare const fileUploadRecipe: import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "item" | "label" | "trigger" | "clearTrigger" | "itemGroup" | "dropzone" | "itemDeleteTrigger" | "itemName" | "itemPreview" | "itemPreviewImage" | "itemSizeText", import("@ndla/styled-system/types").SlotRecipeVariantRecord<"root" | "item" | "label" | "trigger" | "clearTrigger" | "itemGroup" | "dropzone" | "itemDeleteTrigger" | "itemName" | "itemPreview" | "itemPreviewImage" | "itemSizeText">>;
13
+ declare const fileUploadRecipe: import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "item" | "label" | "itemGroup" | "trigger" | "clearTrigger" | "dropzone" | "itemDeleteTrigger" | "itemName" | "itemPreview" | "itemPreviewImage" | "itemSizeText", import("@ndla/styled-system/types").SlotRecipeVariantRecord<"root" | "item" | "label" | "itemGroup" | "trigger" | "clearTrigger" | "dropzone" | "itemDeleteTrigger" | "itemName" | "itemPreview" | "itemPreviewImage" | "itemSizeText">>;
14
14
  export type FileUploadVariantProps = NonNullable<RecipeVariantProps<typeof fileUploadRecipe>>;
15
15
  export interface FileUploadRootProps extends FileUpload.RootProps, FileUploadVariantProps {
16
16
  }
17
17
  export declare const FileUploadHiddenInput: import("react").ForwardRefExoticComponent<FileUpload.HiddenInputProps & RefAttributes<HTMLInputElement>>;
18
18
  export declare const FileUploadContext: (props: FileUpload.ContextProps) => import("react").ReactNode;
19
- export declare const FileUploadRoot: import("@ndla/styled-system/jsx").StyleContextProvider<import("react").ForwardRefExoticComponent<FileUpload.RootProps & RefAttributes<HTMLDivElement>>, import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "item" | "label" | "trigger" | "clearTrigger" | "itemGroup" | "dropzone" | "itemDeleteTrigger" | "itemName" | "itemPreview" | "itemPreviewImage" | "itemSizeText", import("@ndla/styled-system/types").SlotRecipeVariantRecord<"root" | "item" | "label" | "trigger" | "clearTrigger" | "itemGroup" | "dropzone" | "itemDeleteTrigger" | "itemName" | "itemPreview" | "itemPreviewImage" | "itemSizeText">>>;
19
+ export declare const FileUploadRoot: import("@ndla/styled-system/jsx").StyleContextProvider<import("react").ForwardRefExoticComponent<FileUpload.RootProps & RefAttributes<HTMLDivElement>>, import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "item" | "label" | "itemGroup" | "trigger" | "clearTrigger" | "dropzone" | "itemDeleteTrigger" | "itemName" | "itemPreview" | "itemPreviewImage" | "itemSizeText", import("@ndla/styled-system/types").SlotRecipeVariantRecord<"root" | "item" | "label" | "itemGroup" | "trigger" | "clearTrigger" | "dropzone" | "itemDeleteTrigger" | "itemName" | "itemPreview" | "itemPreviewImage" | "itemSizeText">>>;
20
20
  export declare const FileUploadDropzone: import("@ndla/styled-system/jsx").StyleContextConsumer<import("react").ForwardRefExoticComponent<FileUpload.DropzoneProps & RefAttributes<HTMLDivElement>>>;
21
21
  export declare const FileUploadTrigger: import("@ndla/styled-system/jsx").StyleContextConsumer<import("react").ForwardRefExoticComponent<FileUpload.TriggerProps & RefAttributes<HTMLButtonElement>>>;
22
22
  export declare const FileUploadItemGroup: import("@ndla/styled-system/jsx").StyleContextConsumer<import("react").ForwardRefExoticComponent<FileUpload.ItemGroupProps & RefAttributes<HTMLUListElement>>>;
package/lib/Image.js CHANGED
@@ -113,6 +113,15 @@ const Img = (0, react.forwardRef)(({ fallbackWidth = FALLBACK_WIDTH, crop, focal
113
113
  });
114
114
  });
115
115
  const Image = (0, react.forwardRef)(({ srcSet: srcSetProp, crop, focalPoint, src, contentType, imageLanguage, fallbackWidth = FALLBACK_WIDTH, sizes: sizesProp, alt, fallbackElement, variants, ...props }, ref) => {
116
+ const [hasError, setHasError] = (0, react.useState)(false);
117
+ (0, react.useEffect)(() => {
118
+ setHasError(false);
119
+ }, [
120
+ src,
121
+ srcSetProp,
122
+ sizesProp,
123
+ variants
124
+ ]);
116
125
  if (!src?.length && !variants?.length && fallbackElement) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(StyledFallbackElement, {
117
126
  ...props,
118
127
  ref,
@@ -145,7 +154,16 @@ const Image = (0, react.forwardRef)(({ srcSet: srcSetProp, crop, focalPoint, src
145
154
  alt,
146
155
  src: contentType === "image/gif" ? src : fallbackSrc,
147
156
  ...props,
148
- ref
157
+ ref,
158
+ "data-error": hasError ? "" : void 0,
159
+ onError: (e) => {
160
+ setHasError(true);
161
+ props.onError?.(e);
162
+ },
163
+ onLoad: (e) => {
164
+ setHasError(false);
165
+ props.onLoad?.(e);
166
+ }
149
167
  })
150
168
  ] });
151
169
  });
package/lib/Image.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Image.js","names":["styled","ark"],"sources":["../src/Image.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type ComponentPropsWithRef, type ReactNode, forwardRef } from \"react\";\nimport { ark } from \"@ark-ui/react\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { StyledProps, StyledVariantProps } from \"@ndla/styled-system/types\";\nimport type { ImageVariantDTO, ImageVariantSize } from \"@ndla/types-backend/image-api\";\n\nexport interface ImageCrop {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\nexport interface ImageFocalPoint {\n x: number;\n y: number;\n}\n\ninterface SrcQueryStringOptions {\n width?: number;\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n}\n\nexport const makeSrcQueryString = ({ width, crop, focalPoint, imageLanguage }: SrcQueryStringOptions) => {\n const params = [];\n if (width) {\n params.push(`width=${width}`);\n }\n if (crop) {\n params.push(`cropStartX=${crop.startX}&cropEndX=${crop.endX}&cropStartY=${crop.startY}&cropEndY=${crop.endY}`);\n }\n if (focalPoint) {\n params.push(`focalX=${focalPoint.x}&focalY=${focalPoint.y}`);\n }\n if (imageLanguage) {\n params.push(`language=${imageLanguage}`);\n }\n return params.join(\"&\");\n};\n\ninterface SrcSetOptions {\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n src?: string;\n}\n\nexport const VAR_WIDTHS: Record<ImageVariantSize, number> = {\n icon: 240,\n xsmall: 480,\n small: 800,\n medium: 1080,\n large: 1440,\n xlarge: 1920,\n xxlarge: 2560,\n};\n\nconst IMAGE_WIDTHS = [2720, 2080, 1760, 1440, 1120, 1000, 960, 800, 640, 480, 320, 240, 180];\n\nexport const getVariantSrcSet = (variants: ImageVariantDTO[]) => {\n return variants\n .map((variant) => {\n return `${variant.variantUrl} ${VAR_WIDTHS[variant.size]}w`;\n })\n .join(\", \");\n};\n\nexport const getVariantSizes = (variants: ImageVariantDTO[]) => {\n return variants\n .map((variant, i) => {\n if (i === variants.length - 1) {\n return `${VAR_WIDTHS[variant.size]}px`;\n }\n return `(max-width: ${VAR_WIDTHS[variant.size]}px) ${VAR_WIDTHS[variant.size]}px`;\n })\n .join(\", \");\n};\n\nexport const getSrcSet = ({ src, crop, focalPoint, imageLanguage }: SrcSetOptions) => {\n if (!src) return undefined;\n return IMAGE_WIDTHS.map((width) => {\n const queryString = makeSrcQueryString({ width, crop, focalPoint, imageLanguage });\n const query = queryString.length ? `?${queryString}` : \"\";\n return `${src}${query} ${width}w`;\n }).join(\", \");\n};\n\nconst FALLBACK_WIDTH = 1024;\n\nconst FALLBACK_SIZES = \"(min-width: 1024px) 1024px, 100vw\";\n\nexport interface PictureProps extends StyledProps, ComponentPropsWithRef<\"picture\"> {\n src: string;\n sizes?: string;\n contentType?: string;\n srcSet?: string;\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n}\n\nexport const Picture = forwardRef<HTMLPictureElement, PictureProps>(\n (\n {\n children,\n srcSet: srcSetProp,\n crop,\n focalPoint,\n src,\n imageLanguage,\n contentType,\n sizes = FALLBACK_SIZES,\n ...props\n },\n ref,\n ) => {\n const srcSet = srcSetProp ?? getSrcSet({ src, crop, focalPoint, imageLanguage });\n\n return (\n <styled.picture {...props} ref={ref}>\n {contentType !== \"image/gif\" && <source type={contentType} srcSet={srcSet} sizes={sizes} />}\n {children}\n </styled.picture>\n );\n },\n);\n\nconst StyledImage = styled(\"img\", {\n defaultVariants: { variant: \"regular\" },\n variants: {\n variant: {\n regular: {},\n rounded: {\n borderRadius: \"xsmall\",\n },\n },\n },\n});\n\nconst StyledFallbackElement = styled(\n ark.div,\n {\n base: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n },\n { baseComponent: true },\n);\n\ntype ImageVariantProps = StyledVariantProps<typeof StyledImage>;\n\nexport interface ImgProps extends StyledProps, ComponentPropsWithRef<\"img\">, ImageVariantProps {\n alt: string;\n src: string;\n fallbackWidth?: number;\n contentType?: string;\n crop?: ImageCrop;\n imageLanguage?: string;\n focalPoint?: ImageFocalPoint;\n}\n\nexport const Img = forwardRef<HTMLImageElement, ImgProps>(\n ({ fallbackWidth = FALLBACK_WIDTH, crop, focalPoint, imageLanguage, contentType, src, alt, ...props }, ref) => {\n const queryString = makeSrcQueryString({ width: fallbackWidth, crop, focalPoint, imageLanguage });\n const srcWithParms = queryString ? `${src}?${queryString}` : src;\n return <StyledImage alt={alt} src={contentType === \"image/gif\" ? src : srcWithParms} {...props} ref={ref} />;\n },\n);\n\nexport interface ImageProps extends StyledProps, ComponentPropsWithRef<\"img\">, ImageVariantProps {\n alt: string;\n src?: string;\n sizes?: string;\n fallbackWidth?: number;\n contentType?: string;\n imageLanguage?: string;\n crop?: ImageCrop;\n fallbackElement?: ReactNode;\n focalPoint?: ImageFocalPoint;\n variants?: ImageVariantDTO[];\n}\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n (\n {\n srcSet: srcSetProp,\n crop,\n focalPoint,\n src,\n contentType,\n imageLanguage,\n fallbackWidth = FALLBACK_WIDTH,\n sizes: sizesProp,\n alt,\n fallbackElement,\n variants,\n ...props\n },\n ref,\n ) => {\n if (!src?.length && !variants?.length && fallbackElement) {\n return (\n <StyledFallbackElement {...props} ref={ref}>\n {fallbackElement}\n </StyledFallbackElement>\n );\n }\n\n const queryString = makeSrcQueryString({ width: fallbackWidth, crop, focalPoint, imageLanguage });\n const fallbackSrc = src && queryString ? `${src}?${queryString}` : src;\n\n return (\n <picture>\n {!!variants?.length && !crop && !focalPoint && contentType !== \"image/gif\" && (\n <source\n type={\"image/webp\"}\n srcSet={getVariantSrcSet(variants)}\n sizes={sizesProp ?? getVariantSizes(variants)}\n />\n )}\n {contentType !== \"image/gif\" && (\n <source\n type={contentType}\n srcSet={getSrcSet({ src, crop, focalPoint, imageLanguage })}\n sizes={sizesProp ?? FALLBACK_SIZES}\n />\n )}\n <StyledImage alt={alt} src={contentType === \"image/gif\" ? src : fallbackSrc} {...props} ref={ref} />\n </picture>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"Image.js","names":["styled","ark"],"sources":["../src/Image.tsx"],"sourcesContent":["/**\n * Copyright (c) 2024-present, NDLA.\n *\n * This source code is licensed under the GPLv3 license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\nimport { type ComponentPropsWithRef, type ReactNode, forwardRef, useEffect, useState } from \"react\";\nimport { ark } from \"@ark-ui/react\";\nimport { styled } from \"@ndla/styled-system/jsx\";\nimport type { StyledProps, StyledVariantProps } from \"@ndla/styled-system/types\";\nimport type { ImageVariantDTO, ImageVariantSize } from \"@ndla/types-backend/image-api\";\n\nexport interface ImageCrop {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n}\n\nexport interface ImageFocalPoint {\n x: number;\n y: number;\n}\n\ninterface SrcQueryStringOptions {\n width?: number;\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n}\n\nexport const makeSrcQueryString = ({ width, crop, focalPoint, imageLanguage }: SrcQueryStringOptions) => {\n const params = [];\n if (width) {\n params.push(`width=${width}`);\n }\n if (crop) {\n params.push(`cropStartX=${crop.startX}&cropEndX=${crop.endX}&cropStartY=${crop.startY}&cropEndY=${crop.endY}`);\n }\n if (focalPoint) {\n params.push(`focalX=${focalPoint.x}&focalY=${focalPoint.y}`);\n }\n if (imageLanguage) {\n params.push(`language=${imageLanguage}`);\n }\n return params.join(\"&\");\n};\n\ninterface SrcSetOptions {\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n src?: string;\n}\n\nexport const VAR_WIDTHS: Record<ImageVariantSize, number> = {\n icon: 240,\n xsmall: 480,\n small: 800,\n medium: 1080,\n large: 1440,\n xlarge: 1920,\n xxlarge: 2560,\n};\n\nconst IMAGE_WIDTHS = [2720, 2080, 1760, 1440, 1120, 1000, 960, 800, 640, 480, 320, 240, 180];\n\nexport const getVariantSrcSet = (variants: ImageVariantDTO[]) => {\n return variants\n .map((variant) => {\n return `${variant.variantUrl} ${VAR_WIDTHS[variant.size]}w`;\n })\n .join(\", \");\n};\n\nexport const getVariantSizes = (variants: ImageVariantDTO[]) => {\n return variants\n .map((variant, i) => {\n if (i === variants.length - 1) {\n return `${VAR_WIDTHS[variant.size]}px`;\n }\n return `(max-width: ${VAR_WIDTHS[variant.size]}px) ${VAR_WIDTHS[variant.size]}px`;\n })\n .join(\", \");\n};\n\nexport const getSrcSet = ({ src, crop, focalPoint, imageLanguage }: SrcSetOptions) => {\n if (!src) return undefined;\n return IMAGE_WIDTHS.map((width) => {\n const queryString = makeSrcQueryString({ width, crop, focalPoint, imageLanguage });\n const query = queryString.length ? `?${queryString}` : \"\";\n return `${src}${query} ${width}w`;\n }).join(\", \");\n};\n\nconst FALLBACK_WIDTH = 1024;\n\nconst FALLBACK_SIZES = \"(min-width: 1024px) 1024px, 100vw\";\n\nexport interface PictureProps extends StyledProps, ComponentPropsWithRef<\"picture\"> {\n src: string;\n sizes?: string;\n contentType?: string;\n srcSet?: string;\n crop?: ImageCrop;\n focalPoint?: ImageFocalPoint;\n imageLanguage?: string;\n}\n\nexport const Picture = forwardRef<HTMLPictureElement, PictureProps>(\n (\n {\n children,\n srcSet: srcSetProp,\n crop,\n focalPoint,\n src,\n imageLanguage,\n contentType,\n sizes = FALLBACK_SIZES,\n ...props\n },\n ref,\n ) => {\n const srcSet = srcSetProp ?? getSrcSet({ src, crop, focalPoint, imageLanguage });\n\n return (\n <styled.picture {...props} ref={ref}>\n {contentType !== \"image/gif\" && <source type={contentType} srcSet={srcSet} sizes={sizes} />}\n {children}\n </styled.picture>\n );\n },\n);\n\nconst StyledImage = styled(\"img\", {\n defaultVariants: { variant: \"regular\" },\n variants: {\n variant: {\n regular: {},\n rounded: {\n borderRadius: \"xsmall\",\n },\n },\n },\n});\n\nconst StyledFallbackElement = styled(\n ark.div,\n {\n base: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n },\n { baseComponent: true },\n);\n\ntype ImageVariantProps = StyledVariantProps<typeof StyledImage>;\n\nexport interface ImgProps extends StyledProps, ComponentPropsWithRef<\"img\">, ImageVariantProps {\n alt: string;\n src: string;\n fallbackWidth?: number;\n contentType?: string;\n crop?: ImageCrop;\n imageLanguage?: string;\n focalPoint?: ImageFocalPoint;\n}\n\nexport const Img = forwardRef<HTMLImageElement, ImgProps>(\n ({ fallbackWidth = FALLBACK_WIDTH, crop, focalPoint, imageLanguage, contentType, src, alt, ...props }, ref) => {\n const queryString = makeSrcQueryString({ width: fallbackWidth, crop, focalPoint, imageLanguage });\n const srcWithParms = queryString ? `${src}?${queryString}` : src;\n return <StyledImage alt={alt} src={contentType === \"image/gif\" ? src : srcWithParms} {...props} ref={ref} />;\n },\n);\n\nexport interface ImageProps extends StyledProps, ComponentPropsWithRef<\"img\">, ImageVariantProps {\n alt: string;\n src?: string;\n sizes?: string;\n fallbackWidth?: number;\n contentType?: string;\n imageLanguage?: string;\n crop?: ImageCrop;\n fallbackElement?: ReactNode;\n focalPoint?: ImageFocalPoint;\n variants?: ImageVariantDTO[];\n}\n\nexport const Image = forwardRef<HTMLImageElement, ImageProps>(\n (\n {\n srcSet: srcSetProp,\n crop,\n focalPoint,\n src,\n contentType,\n imageLanguage,\n fallbackWidth = FALLBACK_WIDTH,\n sizes: sizesProp,\n alt,\n fallbackElement,\n variants,\n ...props\n },\n ref,\n ) => {\n const [hasError, setHasError] = useState(false);\n\n useEffect(() => {\n setHasError(false);\n }, [src, srcSetProp, sizesProp, variants]);\n\n if (!src?.length && !variants?.length && fallbackElement) {\n return (\n <StyledFallbackElement {...props} ref={ref}>\n {fallbackElement}\n </StyledFallbackElement>\n );\n }\n\n const queryString = makeSrcQueryString({ width: fallbackWidth, crop, focalPoint, imageLanguage });\n const fallbackSrc = src && queryString ? `${src}?${queryString}` : src;\n\n return (\n <picture>\n {!!variants?.length && !crop && !focalPoint && contentType !== \"image/gif\" && (\n <source\n type={\"image/webp\"}\n srcSet={getVariantSrcSet(variants)}\n sizes={sizesProp ?? getVariantSizes(variants)}\n />\n )}\n {contentType !== \"image/gif\" && (\n <source\n type={contentType}\n srcSet={getSrcSet({ src, crop, focalPoint, imageLanguage })}\n sizes={sizesProp ?? FALLBACK_SIZES}\n />\n )}\n <StyledImage\n alt={alt}\n src={contentType === \"image/gif\" ? src : fallbackSrc}\n {...props}\n ref={ref}\n data-error={hasError ? \"\" : undefined}\n onError={(e) => {\n setHasError(true);\n props.onError?.(e);\n }}\n onLoad={(e) => {\n setHasError(false);\n props.onLoad?.(e);\n }}\n />\n </picture>\n );\n },\n);\n"],"mappings":"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"}
@@ -10,7 +10,7 @@ import type { StyledProps } from "@ndla/styled-system/types";
10
10
  export interface PaginationRootProps extends Pagination.RootProps, StyledProps {
11
11
  translations: Pagination.RootProps["translations"];
12
12
  }
13
- export declare const PaginationRoot: import("@ndla/styled-system/jsx").StyleContextProvider<import("react").ForwardRefExoticComponent<Pagination.RootProps & import("react").RefAttributes<HTMLElement>>, import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "item" | "ellipsis" | "nextTrigger" | "prevTrigger", import("@ndla/styled-system/types").SlotRecipeVariantRecord<"root" | "item" | "ellipsis" | "nextTrigger" | "prevTrigger">>>;
13
+ export declare const PaginationRoot: import("@ndla/styled-system/jsx").StyleContextProvider<import("react").ForwardRefExoticComponent<Pagination.RootProps & import("react").RefAttributes<HTMLElement>>, import("@ndla/styled-system/types").SlotRecipeRuntimeFn<"root" | "item" | "ellipsis" | "nextTrigger" | "prevTrigger" | "firstTrigger" | "lastTrigger", import("@ndla/styled-system/types").SlotRecipeVariantRecord<"root" | "item" | "ellipsis" | "nextTrigger" | "prevTrigger" | "firstTrigger" | "lastTrigger">>>;
14
14
  export declare const PaginationItem: import("@ndla/styled-system/jsx").StyleContextConsumer<import("react").ForwardRefExoticComponent<Pagination.ItemProps & import("react").RefAttributes<HTMLButtonElement>>>;
15
15
  export declare const PaginationEllipsis: import("@ndla/styled-system/jsx").StyleContextConsumer<import("react").ForwardRefExoticComponent<Pagination.EllipsisProps & import("react").RefAttributes<HTMLDivElement>>>;
16
16
  export declare const PaginationContext: (props: Pagination.ContextProps) => import("react").ReactNode;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ndla/primitives",
3
3
  "type": "module",
4
- "version": "1.0.116-alpha.0",
4
+ "version": "1.0.118-alpha.0",
5
5
  "description": "Primitive components for NDLA.",
6
6
  "license": "GPL-3.0",
7
7
  "exports": {
@@ -32,12 +32,12 @@
32
32
  "lib"
33
33
  ],
34
34
  "dependencies": {
35
- "@ark-ui/react": "^5.25.0",
35
+ "@ark-ui/react": "^5.30.0",
36
36
  "@ndla/styled-system": "^0.0.46",
37
37
  "@ndla/util": "^5.0.18-alpha.0"
38
38
  },
39
39
  "devDependencies": {
40
- "@ndla/preset-panda": "^0.0.69",
40
+ "@ndla/preset-panda": "^0.0.70",
41
41
  "@pandacss/dev": "^1.7.0"
42
42
  },
43
43
  "peerDependencies": {
@@ -47,5 +47,5 @@
47
47
  "publishConfig": {
48
48
  "access": "public"
49
49
  },
50
- "gitHead": "121f4f2b6e0468246e98b17315ea35a4b2195c15"
50
+ "gitHead": "53ce5c27affb5122415e71963518dac75fb694a6"
51
51
  }