@mattilsynet/design 2.2.17 → 2.2.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/mtds/analytics/analytics.js +1 -1
  2. package/mtds/analytics/analytics.js.map +1 -1
  3. package/mtds/atlas/atlas-element.d.ts +24 -0
  4. package/mtds/atlas/atlas-element.js +57 -0
  5. package/mtds/atlas/atlas-element.js.map +1 -0
  6. package/mtds/atlas/atlas.css.js +72 -0
  7. package/mtds/atlas/atlas.css.js.map +1 -0
  8. package/mtds/atlas/atlas.d.ts +14 -0
  9. package/mtds/atlas/atlas.stories.d.ts +16 -0
  10. package/mtds/atlas.d.ts +1 -0
  11. package/mtds/atlas.iife.js +745 -0
  12. package/mtds/atlas.js +5 -0
  13. package/mtds/atlas.js.map +1 -0
  14. package/mtds/chart/chart-element.js +1 -1
  15. package/mtds/chart/chart-element.js.map +1 -1
  16. package/mtds/chart/chart.d.ts +7 -12
  17. package/mtds/chart/chart.js.map +1 -1
  18. package/mtds/dialog/dialog-observer.js +16 -16
  19. package/mtds/dialog/dialog-observer.js.map +1 -1
  20. package/mtds/field/field-observer.js +47 -44
  21. package/mtds/field/field-observer.js.map +1 -1
  22. package/mtds/fieldset/fieldset.stories.d.ts +1 -0
  23. package/mtds/fileupload/fileupload.d.ts +6 -0
  24. package/mtds/fileupload/fileupload.js +13 -0
  25. package/mtds/fileupload/fileupload.js.map +1 -0
  26. package/mtds/{lawpicker/lawpicker.stories.d.ts → fileupload/fileupload.stories.d.ts} +1 -0
  27. package/mtds/illustrations/byggning-1-gronn.svg +1 -0
  28. package/mtds/illustrations/byggning-1-mattilsynet.svg +1 -0
  29. package/mtds/illustrations/byggning-2-gronn.svg +1 -0
  30. package/mtds/illustrations/byggning-3-gronn.svg +1 -0
  31. package/mtds/illustrations/byggning-4-gronn.svg +1 -0
  32. package/mtds/illustrations/byggning-5-gronn.svg +1 -0
  33. package/mtds/illustrations/byggning-6-blaa.svg +1 -0
  34. package/mtds/illustrations/byggning-7-blaa.svg +1 -0
  35. package/mtds/illustrations/byggning-8-blaa.svg +1 -0
  36. package/mtds/illustrations/byggningsrekke-1-gronn.svg +1 -0
  37. package/mtds/illustrations/byggningsrekke-1-mattilsynet.svg +1 -0
  38. package/mtds/illustrations/byggningsrekke-2-gronn.svg +1 -0
  39. package/mtds/illustrations/byggningsrekke-3-blaa.svg +1 -0
  40. package/mtds/illustrations/debatt.svg +1 -0
  41. package/mtds/illustrations/egg.svg +1 -0
  42. package/mtds/illustrations/flagg-aaland.svg +1 -0
  43. package/mtds/illustrations/flagg-danmark.svg +1 -0
  44. package/mtds/illustrations/flagg-faeroyene.svg +1 -0
  45. package/mtds/illustrations/flagg-finland.svg +1 -0
  46. package/mtds/illustrations/flagg-gronland.svg +1 -0
  47. package/mtds/illustrations/flagg-island.svg +1 -0
  48. package/mtds/illustrations/flagg-norge.svg +1 -0
  49. package/mtds/illustrations/flagg-sapmi.svg +1 -0
  50. package/mtds/illustrations/flagg-sverige.svg +1 -0
  51. package/mtds/illustrations/forstorrelsesglass.svg +1 -0
  52. package/mtds/illustrations/hengelas.svg +1 -0
  53. package/mtds/illustrations/index.json +139 -0
  54. package/mtds/illustrations/kompass.svg +1 -0
  55. package/mtds/illustrations/skinke.svg +1 -0
  56. package/mtds/illustrations/system-stotte.svg +1 -0
  57. package/mtds/illustrations/system.svg +1 -0
  58. package/mtds/illustrations/tre-1.svg +1 -0
  59. package/mtds/illustrations/tre-2.svg +1 -0
  60. package/mtds/illustrations/tre-3.svg +1 -0
  61. package/mtds/index.d.ts +3 -0
  62. package/mtds/index.iife.js +15 -15
  63. package/mtds/index.js +20 -15
  64. package/mtds/index.js.map +1 -1
  65. package/mtds/law/law-helper.d.ts +38 -0
  66. package/mtds/law/law-helper.js +78 -0
  67. package/mtds/law/law-helper.js.map +1 -0
  68. package/mtds/law/law.d.ts +2 -0
  69. package/mtds/law/law.js +10 -0
  70. package/mtds/law/law.js.map +1 -0
  71. package/mtds/law/law.stories.d.ts +16 -0
  72. package/mtds/law/vinforskriften-new.d.ts +1 -0
  73. package/mtds/law/vinforskriften-old.d.ts +1 -0
  74. package/mtds/logo/logo-observer.js +1 -1
  75. package/mtds/logo/logo-observer.js.map +1 -1
  76. package/mtds/package.json.js +1 -1
  77. package/mtds/react.d.ts +2 -0
  78. package/mtds/react.js +58 -54
  79. package/mtds/react.js.map +1 -1
  80. package/mtds/styles.css +1 -1
  81. package/mtds/styles.json +43 -41
  82. package/mtds/styles.module.css.js +98 -94
  83. package/mtds/styles.module.css.js.map +1 -1
  84. package/mtds/table/table.stories.d.ts +1 -0
  85. package/mtds/utils.js +36 -30
  86. package/mtds/utils.js.map +1 -1
  87. package/package.json +15 -16
  88. package/mtds/lawpicker/lawpicker-element.d.ts +0 -18
  89. package/mtds/map/map-element.d.ts +0 -47
  90. package/mtds/map/map-element.js +0 -82
  91. package/mtds/map/map-element.js.map +0 -1
  92. package/mtds/map/map.css.js +0 -46
  93. package/mtds/map/map.css.js.map +0 -1
  94. package/mtds/map/map.stories.d.ts +0 -10
  95. package/mtds/map.d.ts +0 -1
  96. package/mtds/map.iife.js +0 -722
  97. package/mtds/map.js +0 -8
  98. package/mtds/map.js.map +0 -1
package/mtds/styles.json CHANGED
@@ -1,43 +1,45 @@
1
1
  {
2
- "alert": "_alert_3aj69_1 _ds-alert_pxycd_3",
3
- "app": "_app_3aj69_1",
4
- "sticky": "_sticky_3aj69_1",
5
- "avatar": "_avatar_3aj69_1 _ds-avatar_pxycd_1",
6
- "badge": "_badge_3aj69_1",
7
- "breadcrumbs": "_breadcrumbs_3aj69_1 _ds-breadcrumbs_pxycd_5",
8
- "button": "_button_3aj69_1 _ds-button_pxycd_1",
9
- "card": "_card_3aj69_1",
10
- "group": "_group_3aj69_1",
11
- "chip": "_chip_3aj69_1 _ds-chip_pxycd_5",
12
- "details": "_details_3aj69_1 _ds-details_pxycd_3",
13
- "dialog": "_dialog_3aj69_1 _ds-dialog_pxycd_5",
14
- "divider": "_divider_3aj69_1",
15
- "errorsummary": "_errorsummary_3aj69_1 _ds-error-summary_pxycd_5",
16
- "field": "_field_3aj69_1 _ds-field_pxycd_1",
17
- "affixes": "_affixes_3aj69_1 _ds-field-affixes_pxycd_3",
18
- "fieldset": "_fieldset_3aj69_1 _ds-fieldset_pxycd_3",
19
- "helptext": "_helptext_3aj69_1 _ds-focus_pxycd_1",
20
- "input": "_input_3aj69_1 _ds-input_pxycd_1",
21
- "grid": "_grid_3aj69_1",
22
- "flex": "_flex_3aj69_1",
23
- "link": "_link_3aj69_1",
24
- "logo": "_logo_3aj69_1",
25
- "pagination": "_pagination_3aj69_1 _ds-pagination_pxycd_5",
26
- "popover": "_popover_3aj69_1",
27
- "progress": "_progress_3aj69_1",
28
- "skeleton": "_skeleton_3aj69_1 _ds-skeleton_pxycd_5",
29
- "spinner": "_spinner_3aj69_1",
30
- "steps": "_steps_3aj69_1",
31
- "table": "_table_3aj69_1 _ds-table_pxycd_5",
32
- "tabs": "_tabs_3aj69_1 _ds-tabs_pxycd_5",
33
- "tag": "_tag_3aj69_1 _ds-tag_pxycd_5",
34
- "toast": "_toast_3aj69_1",
35
- "togglegroup": "_togglegroup_3aj69_1",
36
- "heading": "_heading_3aj69_1 _ds-heading_pxycd_1",
37
- "ingress": "_ingress_3aj69_1",
38
- "muted": "_muted_3aj69_1",
39
- "info": "_info_3aj69_1",
40
- "prose": "_prose_3aj69_1",
41
- "validation": "_validation_3aj69_1 _ds-validation-message_pxycd_1",
42
- "body": "_body_3aj69_173"
2
+ "alert": "_alert_nq83g_1 _ds-alert_dbymd_3",
3
+ "app": "_app_nq83g_1",
4
+ "sticky": "_sticky_nq83g_1",
5
+ "avatar": "_avatar_nq83g_1 _ds-avatar_dbymd_1",
6
+ "badge": "_badge_nq83g_1",
7
+ "breadcrumbs": "_breadcrumbs_nq83g_1 _ds-breadcrumbs_dbymd_5",
8
+ "button": "_button_nq83g_1 _ds-button_dbymd_1",
9
+ "card": "_card_nq83g_1",
10
+ "group": "_group_nq83g_1",
11
+ "chip": "_chip_nq83g_1 _ds-chip_dbymd_5",
12
+ "details": "_details_nq83g_1 _ds-details_dbymd_3",
13
+ "dialog": "_dialog_nq83g_1 _ds-dialog_dbymd_5",
14
+ "divider": "_divider_nq83g_1",
15
+ "errorsummary": "_errorsummary_nq83g_1 _ds-error-summary_dbymd_5",
16
+ "field": "_field_nq83g_1 _ds-field_dbymd_1",
17
+ "affixes": "_affixes_nq83g_1 _ds-field-affixes_dbymd_3",
18
+ "fieldset": "_fieldset_nq83g_1 _ds-fieldset_dbymd_3",
19
+ "fileupload": "_fileupload_nq83g_1",
20
+ "helptext": "_helptext_nq83g_1 _ds-focus_dbymd_1",
21
+ "input": "_input_nq83g_1 _ds-input_dbymd_1",
22
+ "law": "_law_nq83g_1",
23
+ "grid": "_grid_nq83g_1",
24
+ "flex": "_flex_nq83g_1",
25
+ "link": "_link_nq83g_1",
26
+ "logo": "_logo_nq83g_1",
27
+ "pagination": "_pagination_nq83g_1 _ds-pagination_dbymd_5",
28
+ "popover": "_popover_nq83g_1",
29
+ "progress": "_progress_nq83g_1",
30
+ "skeleton": "_skeleton_nq83g_1 _ds-skeleton_dbymd_5",
31
+ "spinner": "_spinner_nq83g_1",
32
+ "steps": "_steps_nq83g_1",
33
+ "table": "_table_nq83g_1 _ds-table_dbymd_5",
34
+ "tabs": "_tabs_nq83g_1 _ds-tabs_dbymd_5",
35
+ "tag": "_tag_nq83g_1 _ds-tag_dbymd_5",
36
+ "toast": "_toast_nq83g_1",
37
+ "togglegroup": "_togglegroup_nq83g_1",
38
+ "heading": "_heading_nq83g_1 _ds-heading_dbymd_1",
39
+ "ingress": "_ingress_nq83g_1",
40
+ "muted": "_muted_nq83g_1",
41
+ "info": "_info_nq83g_1",
42
+ "prose": "_prose_nq83g_1",
43
+ "validation": "_validation_nq83g_1 _ds-validation-message_dbymd_1",
44
+ "body": "_body_nq83g_171"
43
45
  }
@@ -1,112 +1,116 @@
1
- const _ = "_alert_3aj69_1 _ds-alert_pxycd_3", t = "_app_3aj69_1", s = "_sticky_3aj69_1", a = "_avatar_3aj69_1 _ds-avatar_pxycd_1", o = "_badge_3aj69_1", e = "_breadcrumbs_3aj69_1 _ds-breadcrumbs_pxycd_5", n = "_button_3aj69_1 _ds-button_pxycd_1", d = "_card_3aj69_1", c = "_group_3aj69_1", r = "_chip_3aj69_1 _ds-chip_pxycd_5", i = "_details_3aj69_1 _ds-details_pxycd_3", l = "_dialog_3aj69_1 _ds-dialog_pxycd_5", p = "__drawer_3aj69_1", j = "_divider_3aj69_1", g = "_errorsummary_3aj69_1 _ds-error-summary_pxycd_5", y = "__errorsummary_3aj69_1", u = "_field_3aj69_1 _ds-field_pxycd_1", x = "__datalist_3aj69_1", m = "_affixes_3aj69_1 _ds-field-affixes_pxycd_3", b = "_fieldset_3aj69_1 _ds-fieldset_pxycd_3", f = "_helptext_3aj69_1 _ds-focus_pxycd_1", k = "_input_3aj69_1 _ds-input_pxycd_1", h = "_grid_3aj69_1", v = "_flex_3aj69_1", w = "_link_3aj69_1", C = "_logo_3aj69_1", M = "_pagination_3aj69_1 _ds-pagination_pxycd_5", O = "_popover_3aj69_1", S = "_progress_3aj69_1", T = "__indeterminate_3aj69_1", q = "_skeleton_3aj69_1 _ds-skeleton_pxycd_5", z = "__skeleton_3aj69_1", A = "_spinner_3aj69_1", B = "_steps_3aj69_1", D = "_table_3aj69_1 _ds-table_pxycd_5", E = "__scrollShadow_3aj69_1", F = "_tabs_3aj69_1 _ds-tabs_pxycd_5", G = "__scrollMask_3aj69_1", H = "_tag_3aj69_1 _ds-tag_pxycd_5", I = "_toast_3aj69_1", J = "__toastClose_3aj69_1", K = "__toastOpen_3aj69_1", L = "__toastTimeout_3aj69_1", N = "_togglegroup_3aj69_1", P = "__tooltip_3aj69_1", Q = "_heading_3aj69_1 _ds-heading_pxycd_1", R = "_ingress_3aj69_1", U = "_muted_3aj69_1", V = "_info_3aj69_1", W = "_prose_3aj69_1", X = "_validation_3aj69_1 _ds-validation-message_pxycd_1", Y = "_body_3aj69_173", Z = "__checked_3aj69_1", $ = {
1
+ const _ = "_alert_nq83g_1 _ds-alert_dbymd_3", t = "_app_nq83g_1", s = "_sticky_nq83g_1", n = "_avatar_nq83g_1 _ds-avatar_dbymd_1", o = "_badge_nq83g_1", e = "_breadcrumbs_nq83g_1 _ds-breadcrumbs_dbymd_5", d = "_button_nq83g_1 _ds-button_dbymd_1", a = "_card_nq83g_1", g = "_group_nq83g_1", r = "_chip_nq83g_1 _ds-chip_dbymd_5", i = "_details_nq83g_1 _ds-details_dbymd_3", c = "_dialog_nq83g_1 _ds-dialog_dbymd_5", l = "__drawer_nq83g_1", p = "_divider_nq83g_1", q = "_errorsummary_nq83g_1 _ds-error-summary_dbymd_5", m = "__errorsummary_nq83g_1", b = "_field_nq83g_1 _ds-field_dbymd_1", u = "__datalist_nq83g_1", y = "_affixes_nq83g_1 _ds-field-affixes_dbymd_3", f = "_fieldset_nq83g_1 _ds-fieldset_dbymd_3", k = "_fileupload_nq83g_1", h = "_helptext_nq83g_1 _ds-focus_dbymd_1", v = "_input_nq83g_1 _ds-input_dbymd_1", x = "_law_nq83g_1", w = "_grid_nq83g_1", C = "_flex_nq83g_1", M = "_link_nq83g_1", O = "_logo_nq83g_1", S = "_pagination_nq83g_1 _ds-pagination_dbymd_5", T = "_popover_nq83g_1", j = "_progress_nq83g_1", z = "__indeterminate_nq83g_1", A = "_skeleton_nq83g_1 _ds-skeleton_dbymd_5", B = "__skeleton_nq83g_1", D = "_spinner_nq83g_1", E = "_steps_nq83g_1", F = "_table_nq83g_1 _ds-table_dbymd_5", G = "__scrollShadow_nq83g_1", H = "_tabs_nq83g_1 _ds-tabs_dbymd_5", I = "__scrollMask_nq83g_1", J = "_tag_nq83g_1 _ds-tag_dbymd_5", K = "_toast_nq83g_1", L = "__toastClose_nq83g_1", N = "__toastOpen_nq83g_1", P = "__toastTimeout_nq83g_1", Q = "_togglegroup_nq83g_1", R = "__tooltip_nq83g_1", U = "_heading_nq83g_1 _ds-heading_dbymd_1", V = "_ingress_nq83g_1", W = "_muted_nq83g_1", X = "_info_nq83g_1", Y = "_prose_nq83g_1", Z = "_validation_nq83g_1 _ds-validation-message_dbymd_1", $ = "_body_nq83g_171", __ = "__checked_nq83g_1", t_ = {
2
2
  alert: _,
3
3
  app: t,
4
4
  sticky: s,
5
- avatar: a,
5
+ avatar: n,
6
6
  badge: o,
7
7
  breadcrumbs: e,
8
- button: n,
9
- card: d,
10
- group: c,
8
+ button: d,
9
+ card: a,
10
+ group: g,
11
11
  chip: r,
12
12
  details: i,
13
- dialog: l,
14
- _drawer: p,
15
- divider: j,
16
- errorsummary: g,
17
- _errorsummary: y,
18
- field: u,
19
- _datalist: x,
20
- affixes: m,
21
- fieldset: b,
22
- helptext: f,
23
- input: k,
24
- grid: h,
25
- flex: v,
26
- link: w,
27
- logo: C,
28
- pagination: M,
29
- popover: O,
30
- progress: S,
31
- _indeterminate: T,
32
- skeleton: q,
33
- _skeleton: z,
34
- spinner: A,
35
- steps: B,
36
- table: D,
37
- _scrollShadow: E,
38
- tabs: F,
39
- _scrollMask: G,
40
- tag: H,
41
- toast: I,
42
- _toastClose: J,
43
- _toastOpen: K,
44
- _toastTimeout: L,
45
- togglegroup: N,
46
- _tooltip: P,
47
- heading: Q,
48
- ingress: R,
49
- muted: U,
50
- info: V,
51
- prose: W,
52
- validation: X,
53
- body: Y,
54
- _checked: Z
13
+ dialog: c,
14
+ _drawer: l,
15
+ divider: p,
16
+ errorsummary: q,
17
+ _errorsummary: m,
18
+ field: b,
19
+ _datalist: u,
20
+ affixes: y,
21
+ fieldset: f,
22
+ fileupload: k,
23
+ helptext: h,
24
+ input: v,
25
+ law: x,
26
+ grid: w,
27
+ flex: C,
28
+ link: M,
29
+ logo: O,
30
+ pagination: S,
31
+ popover: T,
32
+ progress: j,
33
+ _indeterminate: z,
34
+ skeleton: A,
35
+ _skeleton: B,
36
+ spinner: D,
37
+ steps: E,
38
+ table: F,
39
+ _scrollShadow: G,
40
+ tabs: H,
41
+ _scrollMask: I,
42
+ tag: J,
43
+ toast: K,
44
+ _toastClose: L,
45
+ _toastOpen: N,
46
+ _toastTimeout: P,
47
+ togglegroup: Q,
48
+ _tooltip: R,
49
+ heading: U,
50
+ ingress: V,
51
+ muted: W,
52
+ info: X,
53
+ prose: Y,
54
+ validation: Z,
55
+ body: $,
56
+ _checked: __
55
57
  };
56
58
  export {
57
- Z as _checked,
58
- x as _datalist,
59
- p as _drawer,
60
- y as _errorsummary,
61
- T as _indeterminate,
62
- G as _scrollMask,
63
- E as _scrollShadow,
64
- z as _skeleton,
65
- J as _toastClose,
66
- K as _toastOpen,
67
- L as _toastTimeout,
68
- P as _tooltip,
69
- m as affixes,
59
+ __ as _checked,
60
+ u as _datalist,
61
+ l as _drawer,
62
+ m as _errorsummary,
63
+ z as _indeterminate,
64
+ I as _scrollMask,
65
+ G as _scrollShadow,
66
+ B as _skeleton,
67
+ L as _toastClose,
68
+ N as _toastOpen,
69
+ P as _toastTimeout,
70
+ R as _tooltip,
71
+ y as affixes,
70
72
  _ as alert,
71
73
  t as app,
72
- a as avatar,
74
+ n as avatar,
73
75
  o as badge,
74
- Y as body,
76
+ $ as body,
75
77
  e as breadcrumbs,
76
- n as button,
77
- d as card,
78
+ d as button,
79
+ a as card,
78
80
  r as chip,
79
- $ as default,
81
+ t_ as default,
80
82
  i as details,
81
- l as dialog,
82
- j as divider,
83
- g as errorsummary,
84
- u as field,
85
- b as fieldset,
86
- v as flex,
87
- h as grid,
88
- c as group,
89
- Q as heading,
90
- f as helptext,
91
- V as info,
92
- R as ingress,
93
- k as input,
94
- w as link,
95
- C as logo,
96
- U as muted,
97
- M as pagination,
98
- O as popover,
99
- S as progress,
100
- W as prose,
101
- q as skeleton,
102
- A as spinner,
103
- B as steps,
83
+ c as dialog,
84
+ p as divider,
85
+ q as errorsummary,
86
+ b as field,
87
+ f as fieldset,
88
+ k as fileupload,
89
+ C as flex,
90
+ w as grid,
91
+ g as group,
92
+ U as heading,
93
+ h as helptext,
94
+ X as info,
95
+ V as ingress,
96
+ v as input,
97
+ x as law,
98
+ M as link,
99
+ O as logo,
100
+ W as muted,
101
+ S as pagination,
102
+ T as popover,
103
+ j as progress,
104
+ Y as prose,
105
+ A as skeleton,
106
+ D as spinner,
107
+ E as steps,
104
108
  s as sticky,
105
- D as table,
106
- F as tabs,
107
- H as tag,
108
- I as toast,
109
- N as togglegroup,
110
- X as validation
109
+ F as table,
110
+ H as tabs,
111
+ J as tag,
112
+ K as toast,
113
+ Q as togglegroup,
114
+ Z as validation
111
115
  };
112
116
  //# sourceMappingURL=styles.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"styles.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -31,6 +31,7 @@ export declare const WithHorizontalTitles: Story;
31
31
  export declare const WithFixedWidths: Story;
32
32
  export declare const WithAlign: Story;
33
33
  export declare const WithNumericValues: Story;
34
+ export declare const WithJustify: Story;
34
35
  export declare const WithFooter: Story;
35
36
  export declare const WithBorderAround: Story;
36
37
  export declare const WithoutBorders: Story;
package/mtds/utils.js CHANGED
@@ -1,14 +1,14 @@
1
- import { autoUpdate as b, computePosition as E, flip as y, shift as C, size as T } from "@floating-ui/dom";
2
- import L from "clsx";
3
- import M from "./styles.module.css.js";
4
- const O = { capture: !0, passive: !0 }, v = typeof window < "u" && typeof document < "u";
1
+ import { autoUpdate as E, computePosition as y, flip as C, shift as T, size as L } from "@floating-ui/dom";
2
+ import M from "clsx";
3
+ import v from "./styles.module.css.js";
4
+ const O = { capture: !0, passive: !0 }, m = typeof window < "u" && typeof document < "u";
5
5
  function k(t, e) {
6
6
  let n;
7
7
  return (...o) => {
8
8
  clearTimeout(n), n = setTimeout(() => t(...o), e);
9
9
  };
10
10
  }
11
- function d(t, e, n) {
11
+ function f(t, e, n) {
12
12
  return n === void 0 ? t.getAttribute(e) ?? null : (n === null ? t.removeAttribute(e) : t.getAttribute(e) !== n && t.setAttribute(e, n), null);
13
13
  }
14
14
  let A = 0;
@@ -16,37 +16,37 @@ const S = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 5)}`;
16
16
  function x(t) {
17
17
  return t.id || (t.id = `${S}${++A}`), t.id;
18
18
  }
19
- const l = (t, e, [...n]) => {
19
+ const p = (t, e, [...n]) => {
20
20
  for (const o of n[0].split(","))
21
21
  n[0] = o, e[`${t}EventListener`](...n);
22
- }, $ = (t, ...e) => (l("add", t, e), () => H(t, ...e)), H = (t, ...e) => l("remove", t, e), R = (t) => {
23
- if (!v || !window.requestAnimationFrame) return;
22
+ }, $ = (t, ...e) => (p("add", t, e), () => h(t, ...e)), h = (t, ...e) => p("remove", t, e), R = (t) => {
23
+ if (!m || !window.requestAnimationFrame) return;
24
24
  window._mtdsCleanups || (window._mtdsCleanups = /* @__PURE__ */ new Map());
25
25
  const e = () => requestAnimationFrame(() => {
26
26
  const n = String(t).replace(/(\n|\s)/g, "");
27
27
  window._mtdsCleanups?.get(n)?.map((o) => o()), window._mtdsCleanups?.set(n, t());
28
28
  });
29
29
  document.readyState === "complete" ? e() : $(window, "load", e);
30
- }, r = /* @__PURE__ */ new WeakMap(), h = `.${M.dialog.split(" ")[0]}`;
31
- function D(t, e, { contain: n, middleware: o, placement: i, ...s } = {}) {
32
- if (r.get(t)?.(), r.delete(t), e) {
33
- const m = t.closest(h)?.querySelector(":scope > footer"), u = Number(d(t, "data-inset")) || 20, f = { bottom: (m?.clientHeight || 0) + u, left: u, right: u, top: u }, p = d(t, "data-position") ?? "bottom";
34
- r.set(
30
+ }, c = /* @__PURE__ */ new WeakMap(), H = `.${v.dialog.split(" ")[0]}`;
31
+ function _(t, e, { contain: n, middleware: o, placement: i, ...s } = {}) {
32
+ if (c.get(t)?.(), c.delete(t), e) {
33
+ const u = t.closest(H)?.querySelector(":scope > footer"), r = Number(f(t, "data-inset")) || 20, l = { bottom: (u?.clientHeight || 0) + r, left: r, right: r, top: r }, a = f(t, "data-position") ?? "bottom";
34
+ c.set(
35
35
  t,
36
- b(e, t, () => {
36
+ E(e, t, () => {
37
37
  if (!t.isConnected || !e.isConnected || t.hidden)
38
- return D(t, !1);
39
- E(e, t, {
38
+ return _(t, !1);
39
+ y(e, t, {
40
40
  ...s,
41
- placement: i || p,
41
+ placement: i || a,
42
42
  middleware: [
43
- y({ padding: f }),
44
- C(),
45
- ...n ? [T({ padding: f, apply: n })] : [],
43
+ C({ padding: l }),
44
+ T(),
45
+ ...n ? [L({ padding: l, apply: n })] : [],
46
46
  ...o || []
47
47
  ]
48
- }).then(({ x: a, y: w }) => {
49
- t.style.left = `${a}px`, t.style.top = `${w}px`;
48
+ }).then(({ x: w, y: b }) => {
49
+ t.style.left = `${w}px`, t.style.top = `${b}px`;
50
50
  });
51
51
  })
52
52
  );
@@ -55,32 +55,38 @@ function D(t, e, { contain: n, middleware: o, placement: i, ...s } = {}) {
55
55
  function U(t, ...e) {
56
56
  let n = 0;
57
57
  const o = () => setTimeout(i, 200), i = () => {
58
+ if (!m) return u();
58
59
  t([], s), s.takeRecords(), n = 0;
59
60
  }, s = new MutationObserver(() => {
60
61
  n || (n = requestAnimationFrame(o));
61
- });
62
+ }), u = () => {
63
+ try {
64
+ s.disconnect();
65
+ } catch {
66
+ }
67
+ };
62
68
  return s.observe(document.documentElement, {
63
69
  attributeFilter: e,
64
70
  attributes: !0,
65
71
  childList: !0,
66
72
  subtree: !0
67
- }), () => s.disconnect();
73
+ }), u;
68
74
  }
69
- const P = (t) => t instanceof HTMLElement && "validity" in t && !(t instanceof HTMLButtonElement), c = "aria-selected", W = ({ className: t, hidden: e, open: n, ...o }, i) => (o.suppressHydrationWarning = !0, o[c] !== void 0 && (o[c] = `${(o[c] || "false") !== "false"}`), (t || i) && (o.class = L(i, t)), e && (o.hidden = !0), n && (o.open = !0), o), g = (t, e, n) => {
75
+ const P = (t) => t instanceof HTMLElement && "validity" in t && !(t instanceof HTMLButtonElement), d = "aria-selected", W = ({ className: t, hidden: e, open: n, ...o }, i) => (o.suppressHydrationWarning = !0, o[d] !== void 0 && (o[d] = `${(o[d] || "false") !== "false"}`), (t || i) && (o.class = M(i, t)), e && (o.hidden = !0), n && (o.open = !0), o), g = (t, e, n) => {
70
76
  const o = document.createElement(t);
71
- if (n && (o.textContent = n), e) for (const [i, s] of Object.entries(e)) d(o, i, s);
77
+ if (n && (o.textContent = n), e) for (const [i, s] of Object.entries(e)) f(o, i, s);
72
78
  return o;
73
79
  }, B = typeof HTMLElement > "u" ? class {
74
80
  } : HTMLElement;
75
81
  export {
76
- v as IS_BROWSER,
82
+ m as IS_BROWSER,
77
83
  B as MTDSElement,
78
84
  O as QUICK_EVENT,
79
- D as anchorPosition,
80
- d as attr,
85
+ _ as anchorPosition,
86
+ f as attr,
81
87
  k as debounce,
82
88
  P as isInputLike,
83
- H as off,
89
+ h as off,
84
90
  $ as on,
85
91
  R as onLoaded,
86
92
  U as onMutation,
package/mtds/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../designsystem/utils.ts"],"sourcesContent":["import type { Placement, SizeOptions } from \"@floating-ui/dom\";\nimport {\n\tautoUpdate,\n\tcomputePosition,\n\tflip,\n\tshift,\n\tsize,\n} from \"@floating-ui/dom\";\nimport clsx from \"clsx\";\nimport styles from \"./styles.module.css\";\n\nexport const QUICK_EVENT = { capture: true, passive: true };\nexport const IS_BROWSER =\n\ttypeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n// TODO: Documentation for prettyNumber\nlet INTL_NUM: Intl.NumberFormat | undefined;\nexport function prettyNumber(number: number | string) {\n\tif (!INTL_NUM)\n\t\tINTL_NUM = new Intl.NumberFormat(\n\t\t\t(IS_BROWSER && attr(document.documentElement, \"lang\")) || \"no\",\n\t\t);\n\treturn INTL_NUM.format(Number(number));\n}\n\nexport function debounce<T extends unknown[]>(\n\tcallback: (...args: T) => void,\n\tdelay: number,\n) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn (...args: T) => {\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(() => callback(...args), delay);\n\t};\n}\n\n/**\n * attr\n * @description Utility to quickly get, set and remove attributes\n * @param el The Element to use as EventTarget\n * @param name The attribute name to get, set or remove, or a object to set multiple attributes\n * @param value A valid attribute value or null to remove attribute\n */\nexport function attr(\n\tel: Element,\n\tname: string,\n\tvalue?: string | null,\n): string | null {\n\tif (value === undefined) return el.getAttribute(name) ?? null; // Fallback to null only if el is undefined\n\tif (value === null) el.removeAttribute(name);\n\telse if (el.getAttribute(name) !== value) el.setAttribute(name, value);\n\treturn null;\n}\n\n/**\n * useId\n * @return A generated unique ID\n */\nlet id = 0;\nconst UUID = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 5)}`;\nexport function useId(el: Element) {\n\tif (!el.id) el.id = `${UUID}${++id}`;\n\treturn el.id;\n}\n\n// Internal helper for on / off\nconst events = (\n\taction: \"add\" | \"remove\",\n\telement: Node | Window,\n\t[...rest]: Parameters<typeof Element.prototype.addEventListener>, // Spreat to make a copy of the array\n): void => {\n\tfor (const type of rest[0].split(\",\")) {\n\t\trest[0] = type;\n\t\telement[`${action}EventListener`](...rest);\n\t}\n};\n\n/**\n * on\n * @param element The Element to use as EventTarget\n * @param types A comma separated string of event types\n * @param listener An event listener function or listener object\n */\nexport const on = (\n\telement: Node | Window,\n\t...rest: Parameters<typeof Element.prototype.addEventListener>\n): (() => void) => {\n\tevents(\"add\", element, rest);\n\treturn () => off(element, ...rest);\n};\n\n/**\n * off\n * @param element The Element to use as EventTarget\n * @param types A comma separated string of event types\n * @param listener An event listener function or listener object\n */\nexport const off = (\n\telement: Node | Window,\n\t...rest: Parameters<typeof Element.prototype.removeEventListener>\n): void => events(\"remove\", element, rest);\n\ndeclare global {\n\tinterface Window {\n\t\t_mtdsCleanups?: Map<string, Array<() => void>>;\n\t}\n}\n\n/**\n * onLoaded\n * @description Runs a callback when window is loaded in browser, and ensures events are unbound if hot reloading\n * @param callback The callback to run when the page is ready\n */\nexport const onLoaded = (setup: () => Array<() => void>) => {\n\tif (!IS_BROWSER || !window.requestAnimationFrame) return; // Skip if not in browser environment\n\tif (!window._mtdsCleanups) window._mtdsCleanups = new Map();\n\n\tconst run = () =>\n\t\trequestAnimationFrame(() => {\n\t\t\tconst key = String(setup).replace(/(\\n|\\s)/g, \"\"); // Create a key based on setup function body\n\t\t\twindow._mtdsCleanups?.get(key)?.map((cleanup) => cleanup()); // Run cleanups\n\t\t\twindow._mtdsCleanups?.set(key, setup()); // Rum setup and store cleanups\n\t\t});\n\n\tif (document.readyState === \"complete\") run();\n\telse on(window, \"load\", run);\n};\n\ntype AnchorOptions = Parameters<typeof computePosition>[2] & {\n\tcontain?: SizeOptions[\"apply\"] | false;\n};\nconst ANCHORED = new WeakMap<Element, ReturnType<typeof autoUpdate>>();\nconst DIALOG = `.${styles.dialog.split(\" \")[0]}`;\nexport function anchorPosition(\n\ttarget: HTMLElement,\n\tanchor: false | Element,\n\t{ contain, middleware, placement, ...options }: AnchorOptions = {},\n) {\n\tANCHORED.get(target)?.(); // Unbind previous anchor position\n\tANCHORED.delete(target);\n\n\t// TODO aria-label på app\n\tif (anchor) {\n\t\tconst footer = target.closest(DIALOG)?.querySelector(\":scope > footer\");\n\t\tconst inset = Number(attr(target, \"data-inset\")) || 20;\n\t\tconst bottom = (footer?.clientHeight || 0) + inset;\n\t\tconst padding = { bottom, left: inset, right: inset, top: inset };\n\t\tconst position = (attr(target, \"data-position\") ?? \"bottom\") as Placement;\n\n\t\tANCHORED.set(\n\t\t\ttarget,\n\t\t\tautoUpdate(anchor, target, () => {\n\t\t\t\tif (!target.isConnected || !anchor.isConnected || target.hidden)\n\t\t\t\t\treturn anchorPosition(target, false);\n\t\t\t\tcomputePosition(anchor, target, {\n\t\t\t\t\t...options,\n\t\t\t\t\tplacement: placement || position,\n\t\t\t\t\tmiddleware: [\n\t\t\t\t\t\tflip({ padding }),\n\t\t\t\t\t\tshift(),\n\t\t\t\t\t\t...(contain ? [size({ padding, apply: contain })] : []),\n\t\t\t\t\t\t...(middleware || []),\n\t\t\t\t\t],\n\t\t\t\t}).then(({ x, y }) => {\n\t\t\t\t\ttarget.style.left = `${x}px`;\n\t\t\t\t\ttarget.style.top = `${y}px`;\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t}\n}\n\n/**\n * Speed up MutationObserver by debouncing and only running when page is visible\n * @return new MutaionObserver\n */\nexport function onMutation(callback: MutationCallback, ...attrs: string[]) {\n\tlet queue = 0;\n\n\tconst onFrame = () => setTimeout(onTimer, 200); // Use both requestAnimationFrame and setTimeout to debounce and only run when visible\n\tconst onTimer = () => {\n\t\tcallback([], observer);\n\t\tobserver.takeRecords(); // Clear records to avoid running callback multiple times\n\t\tqueue = 0;\n\t};\n\tconst observer = new MutationObserver(() => {\n\t\tif (!queue) queue = requestAnimationFrame(onFrame);\n\t});\n\n\tobserver.observe(document.documentElement, {\n\t\tattributeFilter: attrs,\n\t\tattributes: true,\n\t\tchildList: true,\n\t\tsubtree: true,\n\t});\n\n\treturn () => observer.disconnect();\n}\n\n/**\n * isInputLike\n * @description Check if element is an input like element\n * @param el The element to check\n * @returns True if the element is an input like element\n */\nexport const isInputLike = (el: unknown): el is HTMLInputElement =>\n\tel instanceof HTMLElement &&\n\t\"validity\" in el &&\n\t!(el instanceof HTMLButtonElement);\n\n/**\n * toCustomElementProps\n * @description Utility to quickly convert props to custom element attributes\n * @param props The props to convert\n * @returns The converted props\n */\nconst SELECTED = \"aria-selected\";\nexport const toCustomElementProps = (\n\t{ className, hidden, open, ...rest }: Record<string, unknown>,\n\tklass?: string,\n) => {\n\trest.suppressHydrationWarning = true; // Make Next.js happy\n\tif (rest[SELECTED] !== undefined)\n\t\trest[SELECTED] = `${(rest[SELECTED] || \"false\") !== \"false\"}`; // Ensure aria-selected boolean is string\n\tif (className || klass) rest.class = clsx(klass, className as string); // Use class instead of className\n\tif (hidden) rest.hidden = true; // Ensure boolean prop behaviour\n\tif (open) rest.open = true; // Ensure boolean prop behaviour\n\treturn rest;\n};\n\n/**\n * tag\n * @description creates element and assigns properties\n * @param tagName The tagname of element to create\n * @param attrs Optional attributes to add to the element\n * @param text Optional text content to add to the element\n * @return HTMLElement with props\n */\nexport const tag = <TagName extends keyof HTMLElementTagNameMap>(\n\ttagName: TagName,\n\tattrs?: Record<string, string | null>,\n\ttext?: string | null,\n): HTMLElementTagNameMap[TagName] => {\n\tconst el = document.createElement(tagName);\n\tif (text) el.textContent = text;\n\tif (attrs) for (const [key, val] of Object.entries(attrs)) attr(el, key, val);\n\treturn el;\n};\n\n// Make sure we have a HTMLElement to extend (for server side rendering)\nexport const MTDSElement =\n\ttypeof HTMLElement === \"undefined\"\n\t\t? (class {} as typeof HTMLElement)\n\t\t: HTMLElement;\n"],"names":["QUICK_EVENT","IS_BROWSER","debounce","callback","delay","timer","args","attr","el","name","value","id","UUID","useId","events","action","element","type","rest","on","off","onLoaded","setup","run","key","cleanup","ANCHORED","DIALOG","styles","anchorPosition","target","anchor","contain","middleware","placement","options","footer","inset","padding","position","autoUpdate","computePosition","flip","shift","size","x","y","onMutation","attrs","queue","onFrame","onTimer","observer","isInputLike","SELECTED","toCustomElementProps","className","hidden","open","klass","clsx","tag","tagName","text","val","MTDSElement"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../designsystem/utils.ts"],"sourcesContent":["import type { Placement, SizeOptions } from \"@floating-ui/dom\";\nimport {\n\tautoUpdate,\n\tcomputePosition,\n\tflip,\n\tshift,\n\tsize,\n} from \"@floating-ui/dom\";\nimport clsx from \"clsx\";\nimport styles from \"./styles.module.css\";\n\nexport const QUICK_EVENT = { capture: true, passive: true };\nexport const IS_BROWSER =\n\ttypeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n// TODO: Documentation for prettyNumber\nlet INTL_NUM: Intl.NumberFormat | undefined;\nexport function prettyNumber(number: number | string) {\n\tif (!INTL_NUM)\n\t\tINTL_NUM = new Intl.NumberFormat(\n\t\t\t(IS_BROWSER && attr(document.documentElement, \"lang\")) || \"no\",\n\t\t);\n\treturn INTL_NUM.format(Number(number));\n}\n\nexport function debounce<T extends unknown[]>(\n\tcallback: (...args: T) => void,\n\tdelay: number,\n) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn (...args: T) => {\n\t\tclearTimeout(timer);\n\t\ttimer = setTimeout(() => callback(...args), delay);\n\t};\n}\n\n/**\n * attr\n * @description Utility to quickly get, set and remove attributes\n * @param el The Element to use as EventTarget\n * @param name The attribute name to get, set or remove, or a object to set multiple attributes\n * @param value A valid attribute value or null to remove attribute\n */\nexport function attr(\n\tel: Element,\n\tname: string,\n\tvalue?: string | null,\n): string | null {\n\tif (value === undefined) return el.getAttribute(name) ?? null; // Fallback to null only if el is undefined\n\tif (value === null) el.removeAttribute(name);\n\telse if (el.getAttribute(name) !== value) el.setAttribute(name, value);\n\treturn null;\n}\n\n/**\n * useId\n * @return A generated unique ID\n */\nlet id = 0;\nconst UUID = `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 5)}`;\nexport function useId(el: Element) {\n\tif (!el.id) el.id = `${UUID}${++id}`;\n\treturn el.id;\n}\n\n// Internal helper for on / off\nconst events = (\n\taction: \"add\" | \"remove\",\n\telement: Node | Window,\n\t[...rest]: Parameters<typeof Element.prototype.addEventListener>, // Spreat to make a copy of the array\n): void => {\n\tfor (const type of rest[0].split(\",\")) {\n\t\trest[0] = type;\n\t\telement[`${action}EventListener`](...rest);\n\t}\n};\n\n/**\n * on\n * @param element The Element to use as EventTarget\n * @param types A comma separated string of event types\n * @param listener An event listener function or listener object\n */\nexport const on = (\n\telement: Node | Window,\n\t...rest: Parameters<typeof Element.prototype.addEventListener>\n): (() => void) => {\n\tevents(\"add\", element, rest);\n\treturn () => off(element, ...rest);\n};\n\n/**\n * off\n * @param element The Element to use as EventTarget\n * @param types A comma separated string of event types\n * @param listener An event listener function or listener object\n */\nexport const off = (\n\telement: Node | Window,\n\t...rest: Parameters<typeof Element.prototype.removeEventListener>\n): void => events(\"remove\", element, rest);\n\ndeclare global {\n\tinterface Window {\n\t\t_mtdsCleanups?: Map<string, Array<() => void>>;\n\t}\n}\n\n/**\n * onLoaded\n * @description Runs a callback when window is loaded in browser, and ensures events are unbound if hot reloading\n * @param callback The callback to run when the page is ready\n */\nexport const onLoaded = (setup: () => Array<() => void>) => {\n\tif (!IS_BROWSER || !window.requestAnimationFrame) return; // Skip if not in browser environment\n\tif (!window._mtdsCleanups) window._mtdsCleanups = new Map();\n\n\tconst run = () =>\n\t\trequestAnimationFrame(() => {\n\t\t\tconst key = String(setup).replace(/(\\n|\\s)/g, \"\"); // Create a key based on setup function body\n\t\t\twindow._mtdsCleanups?.get(key)?.map((cleanup) => cleanup()); // Run cleanups\n\t\t\twindow._mtdsCleanups?.set(key, setup()); // Rum setup and store cleanups\n\t\t});\n\n\tif (document.readyState === \"complete\") run();\n\telse on(window, \"load\", run);\n};\n\ntype AnchorOptions = Parameters<typeof computePosition>[2] & {\n\tcontain?: SizeOptions[\"apply\"] | false;\n};\nconst ANCHORED = new WeakMap<Element, ReturnType<typeof autoUpdate>>();\nconst DIALOG = `.${styles.dialog.split(\" \")[0]}`;\nexport function anchorPosition(\n\ttarget: HTMLElement,\n\tanchor: false | Element,\n\t{ contain, middleware, placement, ...options }: AnchorOptions = {},\n) {\n\tANCHORED.get(target)?.(); // Unbind previous anchor position\n\tANCHORED.delete(target);\n\n\t// TODO aria-label på app\n\tif (anchor) {\n\t\tconst footer = target.closest(DIALOG)?.querySelector(\":scope > footer\");\n\t\tconst inset = Number(attr(target, \"data-inset\")) || 20;\n\t\tconst bottom = (footer?.clientHeight || 0) + inset;\n\t\tconst padding = { bottom, left: inset, right: inset, top: inset };\n\t\tconst position = (attr(target, \"data-position\") ?? \"bottom\") as Placement;\n\n\t\tANCHORED.set(\n\t\t\ttarget,\n\t\t\tautoUpdate(anchor, target, () => {\n\t\t\t\tif (!target.isConnected || !anchor.isConnected || target.hidden)\n\t\t\t\t\treturn anchorPosition(target, false);\n\t\t\t\tcomputePosition(anchor, target, {\n\t\t\t\t\t...options,\n\t\t\t\t\tplacement: placement || position,\n\t\t\t\t\tmiddleware: [\n\t\t\t\t\t\tflip({ padding }),\n\t\t\t\t\t\tshift(),\n\t\t\t\t\t\t...(contain ? [size({ padding, apply: contain })] : []),\n\t\t\t\t\t\t...(middleware || []),\n\t\t\t\t\t],\n\t\t\t\t}).then(({ x, y }) => {\n\t\t\t\t\ttarget.style.left = `${x}px`;\n\t\t\t\t\ttarget.style.top = `${y}px`;\n\t\t\t\t});\n\t\t\t}),\n\t\t);\n\t}\n}\n\n/**\n * Speed up MutationObserver by debouncing and only running when page is visible\n * @return new MutaionObserver\n */\nexport function onMutation(callback: MutationCallback, ...attrs: string[]) {\n\tlet queue = 0;\n\tconst onFrame = () => setTimeout(onTimer, 200); // Use both requestAnimationFrame and setTimeout to debounce and only run when visible\n\tconst onTimer = () => {\n\t\tif (!IS_BROWSER) return cleanup(); // If using JSDOM, the document might have been removed\n\t\tcallback([], observer);\n\t\tobserver.takeRecords(); // Clear records to avoid running callback multiple times\n\t\tqueue = 0;\n\t};\n\tconst observer = new MutationObserver(() => {\n\t\tif (!queue) queue = requestAnimationFrame(onFrame);\n\t});\n\tconst cleanup = () => {\n\t\ttry {\n\t\t\tobserver.disconnect();\n\t\t} catch (_) {\n\t\t\t// No more observer\n\t\t}\n\t};\n\n\tobserver.observe(document.documentElement, {\n\t\tattributeFilter: attrs,\n\t\tattributes: true,\n\t\tchildList: true,\n\t\tsubtree: true,\n\t});\n\n\treturn cleanup;\n}\n\n/**\n * isInputLike\n * @description Check if element is an input like element\n * @param el The element to check\n * @returns True if the element is an input like element\n */\nexport const isInputLike = (el: unknown): el is HTMLInputElement =>\n\tel instanceof HTMLElement &&\n\t\"validity\" in el &&\n\t!(el instanceof HTMLButtonElement);\n\n/**\n * toCustomElementProps\n * @description Utility to quickly convert props to custom element attributes\n * @param props The props to convert\n * @returns The converted props\n */\nconst SELECTED = \"aria-selected\";\nexport const toCustomElementProps = (\n\t{ className, hidden, open, ...rest }: Record<string, unknown>,\n\tklass?: string,\n) => {\n\trest.suppressHydrationWarning = true; // Make Next.js happy\n\tif (rest[SELECTED] !== undefined)\n\t\trest[SELECTED] = `${(rest[SELECTED] || \"false\") !== \"false\"}`; // Ensure aria-selected boolean is string\n\tif (className || klass) rest.class = clsx(klass, className as string); // Use class instead of className\n\tif (hidden) rest.hidden = true; // Ensure boolean prop behaviour\n\tif (open) rest.open = true; // Ensure boolean prop behaviour\n\treturn rest;\n};\n\n/**\n * tag\n * @description creates element and assigns properties\n * @param tagName The tagname of element to create\n * @param attrs Optional attributes to add to the element\n * @param text Optional text content to add to the element\n * @return HTMLElement with props\n */\nexport const tag = <TagName extends keyof HTMLElementTagNameMap>(\n\ttagName: TagName,\n\tattrs?: Record<string, string | null>,\n\ttext?: string | null,\n): HTMLElementTagNameMap[TagName] => {\n\tconst el = document.createElement(tagName);\n\tif (text) el.textContent = text;\n\tif (attrs) for (const [key, val] of Object.entries(attrs)) attr(el, key, val);\n\treturn el;\n};\n\n// Make sure we have a HTMLElement to extend (for server side rendering)\nexport const MTDSElement =\n\ttypeof HTMLElement === \"undefined\"\n\t\t? (class {} as typeof HTMLElement)\n\t\t: HTMLElement;\n"],"names":["QUICK_EVENT","IS_BROWSER","debounce","callback","delay","timer","args","attr","el","name","value","id","UUID","useId","events","action","element","type","rest","on","off","onLoaded","setup","run","key","cleanup","ANCHORED","DIALOG","styles","anchorPosition","target","anchor","contain","middleware","placement","options","footer","inset","padding","position","autoUpdate","computePosition","flip","shift","size","x","y","onMutation","attrs","queue","onFrame","onTimer","observer","isInputLike","SELECTED","toCustomElementProps","className","hidden","open","klass","clsx","tag","tagName","text","val","MTDSElement"],"mappings":";;;AAWO,MAAMA,IAAc,EAAE,SAAS,IAAM,SAAS,GAAA,GACxCC,IACZ,OAAO,SAAW,OAAe,OAAO,WAAa;AAY/C,SAASC,EACfC,GACAC,GACC;AACD,MAAIC;AAEJ,SAAO,IAAIC,MAAY;AACtB,iBAAaD,CAAK,GAClBA,IAAQ,WAAW,MAAMF,EAAS,GAAGG,CAAI,GAAGF,CAAK;AAAA,EAClD;AACD;AASO,SAASG,EACfC,GACAC,GACAC,GACgB;AAChB,SAAIA,MAAU,SAAkBF,EAAG,aAAaC,CAAI,KAAK,QACrDC,MAAU,OAAMF,EAAG,gBAAgBC,CAAI,IAClCD,EAAG,aAAaC,CAAI,MAAMC,KAAOF,EAAG,aAAaC,GAAMC,CAAK,GAC9D;AACR;AAMA,IAAIC,IAAK;AACT,MAAMC,IAAO,GAAG,KAAK,MAAM,SAAS,EAAE,CAAC,GAAG,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACzE,SAASC,EAAML,GAAa;AAClC,SAAKA,EAAG,OAAIA,EAAG,KAAK,GAAGI,CAAI,GAAG,EAAED,CAAE,KAC3BH,EAAG;AACX;AAGA,MAAMM,IAAS,CACdC,GACAC,GACA,KAAQ,MACE;AACV,aAAWC,KAAQC,EAAK,CAAC,EAAE,MAAM,GAAG;AACnC,IAAAA,EAAK,CAAC,IAAID,GACVD,EAAQ,GAAGD,CAAM,eAAe,EAAE,GAAGG,CAAI;AAE3C,GAQaC,IAAK,CACjBH,MACGE,OAEHJ,EAAO,OAAOE,GAASE,CAAI,GACpB,MAAME,EAAIJ,GAAS,GAAGE,CAAI,IASrBE,IAAM,CAClBJ,MACGE,MACOJ,EAAO,UAAUE,GAASE,CAAI,GAa5BG,IAAW,CAACC,MAAmC;AAC3D,MAAI,CAACrB,KAAc,CAAC,OAAO,sBAAuB;AAClD,EAAK,OAAO,kBAAe,OAAO,oCAAoB,IAAA;AAEtD,QAAMsB,IAAM,MACX,sBAAsB,MAAM;AAC3B,UAAMC,IAAM,OAAOF,CAAK,EAAE,QAAQ,YAAY,EAAE;AAChD,WAAO,eAAe,IAAIE,CAAG,GAAG,IAAI,CAACC,MAAYA,GAAS,GAC1D,OAAO,eAAe,IAAID,GAAKF,EAAA,CAAO;AAAA,EACvC,CAAC;AAEF,EAAI,SAAS,eAAe,aAAYC,EAAA,IACnCJ,EAAG,QAAQ,QAAQI,CAAG;AAC5B,GAKMG,wBAAe,QAAA,GACfC,IAAS,IAAIC,EAAO,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;AACvC,SAASC,EACfC,GACAC,GACA,EAAE,SAAAC,GAAS,YAAAC,GAAY,WAAAC,GAAW,GAAGC,EAAA,IAA2B,IAC/D;AAKD,MAJAT,EAAS,IAAII,CAAM,IAAA,GACnBJ,EAAS,OAAOI,CAAM,GAGlBC,GAAQ;AACX,UAAMK,IAASN,EAAO,QAAQH,CAAM,GAAG,cAAc,iBAAiB,GAChEU,IAAQ,OAAO9B,EAAKuB,GAAQ,YAAY,CAAC,KAAK,IAE9CQ,IAAU,EAAE,SADFF,GAAQ,gBAAgB,KAAKC,GACnB,MAAMA,GAAO,OAAOA,GAAO,KAAKA,EAAA,GACpDE,IAAYhC,EAAKuB,GAAQ,eAAe,KAAK;AAEnD,IAAAJ,EAAS;AAAA,MACRI;AAAA,MACAU,EAAWT,GAAQD,GAAQ,MAAM;AAChC,YAAI,CAACA,EAAO,eAAe,CAACC,EAAO,eAAeD,EAAO;AACxD,iBAAOD,EAAeC,GAAQ,EAAK;AACpC,QAAAW,EAAgBV,GAAQD,GAAQ;AAAA,UAC/B,GAAGK;AAAA,UACH,WAAWD,KAAaK;AAAA,UACxB,YAAY;AAAA,YACXG,EAAK,EAAE,SAAAJ,GAAS;AAAA,YAChBK,EAAA;AAAA,YACA,GAAIX,IAAU,CAACY,EAAK,EAAE,SAAAN,GAAS,OAAON,EAAA,CAAS,CAAC,IAAI,CAAA;AAAA,YACpD,GAAIC,KAAc,CAAA;AAAA,UAAC;AAAA,QACpB,CACA,EAAE,KAAK,CAAC,EAAE,GAAAY,GAAG,GAAAC,QAAQ;AACrB,UAAAhB,EAAO,MAAM,OAAO,GAAGe,CAAC,MACxBf,EAAO,MAAM,MAAM,GAAGgB,CAAC;AAAA,QACxB,CAAC;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,EAEH;AACD;AAMO,SAASC,EAAW5C,MAA+B6C,GAAiB;AAC1E,MAAIC,IAAQ;AACZ,QAAMC,IAAU,MAAM,WAAWC,GAAS,GAAG,GACvCA,IAAU,MAAM;AACrB,QAAI,CAAClD,EAAY,QAAOwB,EAAA;AACxB,IAAAtB,EAAS,CAAA,GAAIiD,CAAQ,GACrBA,EAAS,YAAA,GACTH,IAAQ;AAAA,EACT,GACMG,IAAW,IAAI,iBAAiB,MAAM;AAC3C,IAAKH,MAAOA,IAAQ,sBAAsBC,CAAO;AAAA,EAClD,CAAC,GACKzB,IAAU,MAAM;AACrB,QAAI;AACH,MAAA2B,EAAS,WAAA;AAAA,IACV,QAAY;AAAA,IAEZ;AAAA,EACD;AAEA,SAAAA,EAAS,QAAQ,SAAS,iBAAiB;AAAA,IAC1C,iBAAiBJ;AAAA,IACjB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EAAA,CACT,GAEMvB;AACR;AAQO,MAAM4B,IAAc,CAAC7C,MAC3BA,aAAc,eACd,cAAcA,KACd,EAAEA,aAAc,oBAQX8C,IAAW,iBACJC,IAAuB,CACnC,EAAE,WAAAC,GAAW,QAAAC,GAAQ,MAAAC,GAAM,GAAGxC,EAAA,GAC9ByC,OAEAzC,EAAK,2BAA2B,IAC5BA,EAAKoC,CAAQ,MAAM,WACtBpC,EAAKoC,CAAQ,IAAI,IAAIpC,EAAKoC,CAAQ,KAAK,aAAa,OAAO,MACxDE,KAAaG,OAAOzC,EAAK,QAAQ0C,EAAKD,GAAOH,CAAmB,IAChEC,QAAa,SAAS,KACtBC,QAAW,OAAO,KACfxC,IAWK2C,IAAM,CAClBC,GACAd,GACAe,MACoC;AACpC,QAAMvD,IAAK,SAAS,cAAcsD,CAAO;AAEzC,MADIC,QAAS,cAAcA,IACvBf,EAAO,YAAW,CAACxB,GAAKwC,CAAG,KAAK,OAAO,QAAQhB,CAAK,EAAG,CAAAzC,EAAKC,GAAIgB,GAAKwC,CAAG;AAC5E,SAAOxD;AACR,GAGayD,IACZ,OAAO,cAAgB,MACnB,MAAM;AAAC,IACR;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mattilsynet/design",
3
- "version": "2.2.17",
3
+ "version": "2.2.19",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,23 +24,23 @@
24
24
  "import": "./mtds/react.js",
25
25
  "types": "./mtds/react.d.ts"
26
26
  },
27
- "./map": {
28
- "import": "./mtds/map.js",
29
- "types": "./mtds/map.d.ts"
27
+ "./atlas": {
28
+ "import": "./mtds/atlas.js",
29
+ "types": "./mtds/atlas.d.ts"
30
30
  },
31
31
  "./*.svg": "./mtds/*.svg",
32
32
  "./*.ico": "./mtds/*.ico",
33
33
  "./icons/*": "./mtds/icons/*",
34
34
  "./illustrations/*": "./mtds/illustrations/*",
35
35
  "./index.iife.js": "./mtds/index.iife.js",
36
- "./map.iife.js": "./mtds/map.iife.js",
36
+ "./atlas.iife.js": "./mtds/atlas.iife.js",
37
37
  "./package.json": "./package.json",
38
38
  "./styles.css": "./mtds/styles.css",
39
39
  "./styles.json": "./mtds/styles.json",
40
40
  "./tailwind.css": "./mtds/tailwind.css"
41
41
  },
42
42
  "scripts": {
43
- "build": "vite build --mode iife && vite build --mode iife-map && vite build && rm -rf mtds/docs/ && rm -rf mtds/iife.css",
43
+ "build": "vite build --mode iife && vite build --mode iife-atlas && vite build && rm -rf mtds/docs/ && rm -rf mtds/iife.css",
44
44
  "build:tokens": "npx @digdir/designsystemet tokens build",
45
45
  "format": "npx @biomejs/biome format",
46
46
  "lint": "npx @biomejs/biome lint",
@@ -50,36 +50,35 @@
50
50
  "storybook:build": "npm run build && storybook build"
51
51
  },
52
52
  "devDependencies": {
53
- "@biomejs/biome": "^2.2.6",
54
- "@digdir/designsystemet": "^1.6.1",
53
+ "@biomejs/biome": "^2.3.4",
55
54
  "@digdir/designsystemet-css": "^1.6.1",
56
55
  "@handsontable/react-wrapper": "^16.1.1",
57
56
  "@phosphor-icons/core": "^2.1.1",
58
57
  "@phosphor-icons/react": "^2.1.10",
59
- "@storybook/addon-docs": "^9.1.13",
60
- "@storybook/addon-themes": "^9.1.13",
61
- "@storybook/react-vite": "^9.1.13",
58
+ "@storybook/addon-docs": "^10.0.6",
59
+ "@storybook/addon-themes": "^10.0.6",
60
+ "@storybook/react-vite": "^10.0.6",
62
61
  "@tanstack/react-table": "^8.21.3",
63
- "@types/node": "^24.9.1",
62
+ "@types/node": "^24.10.0",
64
63
  "@types/react": "^19.2.2",
65
64
  "@types/react-dom": "^19.2.2",
66
- "@vitejs/plugin-react": "^5.0.4",
65
+ "@vitejs/plugin-react": "^5.1.0",
67
66
  "fast-glob": "^3.3.3",
68
67
  "handsontable": "^16.1.1",
69
68
  "postcss": "^8.5.6",
70
69
  "postcss-nesting": "^13.0.2",
71
70
  "react": "^19.2.0",
72
71
  "react-dom": "^19.2.0",
73
- "storybook": "^9.1.13",
72
+ "storybook": "^10.0.6",
74
73
  "typescript": "^5.9.3",
75
- "vite": "^7.1.11",
74
+ "vite": "^7.2.2",
76
75
  "vite-plugin-dts": "^4.5.4"
77
76
  },
78
77
  "dependencies": {
79
78
  "@floating-ui/dom": "^1.7.4",
80
79
  "@types/leaflet": "^1.9.21",
81
80
  "@types/leaflet.markercluster": "^1.5.6",
82
- "@u-elements/u-combobox": "^1.0.2",
81
+ "@u-elements/u-combobox": "^1.0.4",
83
82
  "@u-elements/u-datalist": "^1.0.14",
84
83
  "@u-elements/u-details": "^0.1.5",
85
84
  "@u-elements/u-progress": "^0.0.6",
@@ -1,18 +0,0 @@
1
- import { MTDSElement } from '../utils';
2
- import type * as ReactTypes from "react";
3
- type JSXMapAttrs = ReactTypes.HTMLAttributes<MTDLovvelgerElement>;
4
- type JSXMapProps = ReactTypes.DetailedHTMLProps<JSXMapAttrs, MTDLovvelgerElement>;
5
- declare global {
6
- namespace React.JSX {
7
- interface IntrinsicElements {
8
- "mtds-lovvelger": JSXMapProps & {
9
- class?: string;
10
- };
11
- }
12
- }
13
- }
14
- export declare class MTDLovvelgerElement extends MTDSElement {
15
- constructor();
16
- connectedCallback(): void;
17
- }
18
- export {};