@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.
- package/dist/panda.buildinfo.json +16 -31
- package/dist/styles.css +31 -95
- package/es/ArticleLists.mjs +42 -61
- package/es/ArticleLists.mjs.map +1 -1
- package/es/Image.mjs +20 -2
- package/es/Image.mjs.map +1 -1
- package/lib/ArticleLists.d.ts +23 -59
- package/lib/ArticleLists.js +41 -60
- package/lib/ArticleLists.js.map +1 -1
- package/lib/Combobox.d.ts +1 -1
- package/lib/DatePicker.d.ts +1 -1
- package/lib/FileUpload.d.ts +2 -2
- package/lib/Image.js +19 -1
- package/lib/Image.js.map +1 -1
- package/lib/Pagination.d.ts +1 -1
- package/package.json +4 -4
|
@@ -53,42 +53,27 @@
|
|
|
53
53
|
"borderWidth]___[value:0 1px 1px",
|
|
54
54
|
"borderStyle]___[value:solid",
|
|
55
55
|
"borderColor]___[value:stroke.default",
|
|
56
|
-
"
|
|
57
|
-
"
|
|
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%
|
|
59
|
+
"transform]___[value:translateX(calc(-100% - token(spacing.small)))]___[cond:& > li<___>_before",
|
|
61
60
|
"fontVariantNumeric]___[value:tabular-nums]___[cond:& > li<___>_before",
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
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
|
-
.
|
|
665
|
-
|
|
664
|
+
.ps_large {
|
|
665
|
+
padding-inline-start: var(--spacing-large);
|
|
666
666
|
}
|
|
667
667
|
|
|
668
|
-
.
|
|
669
|
-
|
|
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-
|
|
673
|
-
counter-reset:
|
|
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
|
-
.\[\&_\>
|
|
1771
|
-
|
|
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-
|
|
1783
|
-
counter-increment:
|
|
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\%_
|
|
2559
|
-
transform: translateX(calc(-100%
|
|
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\:
|
|
2567
|
-
content: counter
|
|
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\'\]\)\]\:
|
|
2571
|
-
|
|
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\(
|
|
2575
|
-
content: counter(
|
|
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\'\]\)\]\:\[
|
|
2793
|
-
|
|
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
|
|
2801
|
-
counter-
|
|
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\]\:
|
|
2829
|
-
|
|
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
|
|
2873
|
-
content: counter(
|
|
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) {
|
package/es/ArticleLists.mjs
CHANGED
|
@@ -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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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%
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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: "
|
|
76
|
-
"&
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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" }
|
package/es/ArticleLists.mjs.map
CHANGED
|
@@ -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
|
|
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":"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"}
|
|
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":";;;;;;;;;;;;;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;CACH,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;AAE/C,iBAAgB;AACd,cAAY,MAAM;IACjB;EAAC;EAAK;EAAY;EAAW;EAAS,CAAC;AAE1C,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;GACM;GACL,KAAK,gBAAgB,cAAc,MAAM;GACzC,GAAI;GACC;GACL,cAAY,WAAW,KAAK;GAC5B,UAAU,MAAM;AACd,gBAAY,KAAK;AACjB,UAAM,UAAU,EAAE;;GAEpB,SAAS,MAAM;AACb,gBAAY,MAAM;AAClB,UAAM,SAAS,EAAE;;IAEnB;KACM;EAGf"}
|
package/lib/ArticleLists.d.ts
CHANGED
|
@@ -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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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: "
|
|
22
|
+
counterIncrement: "var(--counter-name, numbers)";
|
|
23
23
|
_before: {
|
|
24
|
-
content: "counter
|
|
24
|
+
content: "counters(var(--counter-name, numbers), \".\") \". \"";
|
|
25
25
|
};
|
|
26
|
-
"& > ol:not([data-variant='letters'])": {
|
|
27
|
-
|
|
28
|
-
"&[data-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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: "
|
|
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: "
|
|
40
|
+
counterIncrement: "letters";
|
|
78
41
|
_before: {
|
|
79
|
-
content: "counter(
|
|
42
|
+
content: "counter(letters, upper-alpha) \". \"";
|
|
80
43
|
};
|
|
81
44
|
"& > ol[data-variant='letters'] > li": {
|
|
82
45
|
_before: {
|
|
83
|
-
content: "counter(
|
|
46
|
+
content: "counter(letters, lower-alpha) \". \"";
|
|
84
47
|
};
|
|
85
48
|
"& > ol[data-variant='letters'] > li": {
|
|
86
49
|
_before: {
|
|
87
|
-
content: "counter(
|
|
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
|
|
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 {};
|
package/lib/ArticleLists.js
CHANGED
|
@@ -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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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%
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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: "
|
|
76
|
-
"&
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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" }
|
package/lib/ArticleLists.js.map
CHANGED
|
@@ -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
|
|
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" | "
|
|
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: {
|
package/lib/DatePicker.d.ts
CHANGED
|
@@ -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" | "
|
|
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
|
}
|
package/lib/FileUpload.d.ts
CHANGED
|
@@ -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" | "
|
|
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" | "
|
|
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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"}
|
package/lib/Pagination.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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": "
|
|
50
|
+
"gitHead": "53ce5c27affb5122415e71963518dac75fb694a6"
|
|
51
51
|
}
|