@mieweb/ui 0.10.0-dev.33 → 0.10.0-dev.35

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 (108) hide show
  1. package/dist/{chunk-VPIYTQCV.cjs → chunk-2I4IRQQG.cjs} +12 -5
  2. package/dist/chunk-2I4IRQQG.cjs.map +1 -0
  3. package/dist/{chunk-FKGFOBC2.js → chunk-434L5RYF.js} +4 -4
  4. package/dist/{chunk-FKGFOBC2.js.map → chunk-434L5RYF.js.map} +1 -1
  5. package/dist/{chunk-TPWKM7JH.js → chunk-43K7OQ3E.js} +3 -3
  6. package/dist/{chunk-TPWKM7JH.js.map → chunk-43K7OQ3E.js.map} +1 -1
  7. package/dist/chunk-522WJIVI.js +99 -0
  8. package/dist/chunk-522WJIVI.js.map +1 -0
  9. package/dist/{chunk-LRRSD7LR.js → chunk-5HKZR6UG.js} +3 -3
  10. package/dist/{chunk-LRRSD7LR.js.map → chunk-5HKZR6UG.js.map} +1 -1
  11. package/dist/{chunk-MJJJDQ5P.cjs → chunk-6WX2OR3U.cjs} +10 -2
  12. package/dist/chunk-6WX2OR3U.cjs.map +1 -0
  13. package/dist/chunk-7E46YDOT.cjs +122 -0
  14. package/dist/chunk-7E46YDOT.cjs.map +1 -0
  15. package/dist/{chunk-I2MMUFCN.cjs → chunk-ARIJ5OHW.cjs} +9 -24
  16. package/dist/chunk-ARIJ5OHW.cjs.map +1 -0
  17. package/dist/{chunk-VOYLX32A.cjs → chunk-CLQW724U.cjs} +4 -4
  18. package/dist/{chunk-VOYLX32A.cjs.map → chunk-CLQW724U.cjs.map} +1 -1
  19. package/dist/{chunk-VNEAQCY2.js → chunk-DGHS5IVD.js} +19 -22
  20. package/dist/chunk-DGHS5IVD.js.map +1 -0
  21. package/dist/{chunk-TKWNXAFI.js → chunk-FDA3R5E7.js} +10 -2
  22. package/dist/chunk-FDA3R5E7.js.map +1 -0
  23. package/dist/{chunk-LSMS6DY7.cjs → chunk-FSWHZY3T.cjs} +18 -21
  24. package/dist/chunk-FSWHZY3T.cjs.map +1 -0
  25. package/dist/{chunk-ISUIKUX7.cjs → chunk-H3P7POFC.cjs} +7 -7
  26. package/dist/{chunk-ISUIKUX7.cjs.map → chunk-H3P7POFC.cjs.map} +1 -1
  27. package/dist/{chunk-462XSCP3.cjs → chunk-HCIXGFWR.cjs} +4 -4
  28. package/dist/{chunk-462XSCP3.cjs.map → chunk-HCIXGFWR.cjs.map} +1 -1
  29. package/dist/{chunk-CCAVJSWL.cjs → chunk-HNNWWLKY.cjs} +8 -8
  30. package/dist/{chunk-CCAVJSWL.cjs.map → chunk-HNNWWLKY.cjs.map} +1 -1
  31. package/dist/{chunk-3RXZWHCU.js → chunk-LDBNUJB7.js} +3 -3
  32. package/dist/{chunk-3RXZWHCU.js.map → chunk-LDBNUJB7.js.map} +1 -1
  33. package/dist/{chunk-ADW7ZYCY.cjs → chunk-LRAAJRE7.cjs} +4 -4
  34. package/dist/{chunk-ADW7ZYCY.cjs.map → chunk-LRAAJRE7.cjs.map} +1 -1
  35. package/dist/{chunk-YMILRSRO.js → chunk-MHR2OS5I.js} +3 -3
  36. package/dist/{chunk-YMILRSRO.js.map → chunk-MHR2OS5I.js.map} +1 -1
  37. package/dist/{chunk-ORCCJ5VY.cjs → chunk-OIMXMPH2.cjs} +4 -4
  38. package/dist/{chunk-ORCCJ5VY.cjs.map → chunk-OIMXMPH2.cjs.map} +1 -1
  39. package/dist/{chunk-CEQJGUAS.js → chunk-P4E3K3ND.js} +12 -5
  40. package/dist/chunk-P4E3K3ND.js.map +1 -0
  41. package/dist/{chunk-6JSFT2J5.js → chunk-RLVYWUXG.js} +9 -24
  42. package/dist/chunk-RLVYWUXG.js.map +1 -0
  43. package/dist/{chunk-YRHBSSQ3.cjs → chunk-RV45J2ZT.cjs} +4 -4
  44. package/dist/{chunk-YRHBSSQ3.cjs.map → chunk-RV45J2ZT.cjs.map} +1 -1
  45. package/dist/{chunk-EPTP3VKT.js → chunk-WFL4N5PC.js} +3 -3
  46. package/dist/{chunk-EPTP3VKT.js.map → chunk-WFL4N5PC.js.map} +1 -1
  47. package/dist/{chunk-H3QPREIJ.js → chunk-X3RSNAMX.js} +3 -3
  48. package/dist/{chunk-H3QPREIJ.js.map → chunk-X3RSNAMX.js.map} +1 -1
  49. package/dist/{chunk-T4JYUICS.js → chunk-Y7ZJZLJY.js} +3 -3
  50. package/dist/{chunk-T4JYUICS.js.map → chunk-Y7ZJZLJY.js.map} +1 -1
  51. package/dist/{chunk-P55LNEDH.cjs → chunk-ZSNFL736.cjs} +4 -4
  52. package/dist/{chunk-P55LNEDH.cjs.map → chunk-ZSNFL736.cjs.map} +1 -1
  53. package/dist/components/ActionPlan/index.cjs +5 -5
  54. package/dist/components/ActionPlan/index.js +3 -3
  55. package/dist/components/AssociationList/index.cjs +4 -4
  56. package/dist/components/AssociationList/index.js +2 -2
  57. package/dist/components/Badge/index.cjs +3 -3
  58. package/dist/components/Badge/index.d.cts +15 -1
  59. package/dist/components/Badge/index.d.ts +15 -1
  60. package/dist/components/Badge/index.js +1 -1
  61. package/dist/components/CompletenessMeter/index.cjs +5 -4
  62. package/dist/components/CompletenessMeter/index.js +2 -1
  63. package/dist/components/Progress/index.cjs +6 -6
  64. package/dist/components/Progress/index.d.cts +7 -1
  65. package/dist/components/Progress/index.d.ts +7 -1
  66. package/dist/components/Progress/index.js +1 -1
  67. package/dist/components/RadialExplorer/index.cjs +3 -3
  68. package/dist/components/RadialExplorer/index.js +2 -2
  69. package/dist/components/RecordHeader/index.cjs +4 -4
  70. package/dist/components/RecordHeader/index.d.cts +11 -1
  71. package/dist/components/RecordHeader/index.d.ts +11 -1
  72. package/dist/components/RecordHeader/index.js +2 -2
  73. package/dist/components/RecordLayout/index.cjs +4 -4
  74. package/dist/components/RecordLayout/index.js +2 -2
  75. package/dist/components/SuperChat/index.cjs +2 -2
  76. package/dist/components/SuperChat/index.js +1 -1
  77. package/dist/components/TagEditor/index.cjs +5 -3
  78. package/dist/components/TagEditor/index.js +3 -1
  79. package/dist/components/VideoCard/index.cjs +4 -4
  80. package/dist/components/VideoCard/index.js +2 -2
  81. package/dist/datavis.cjs +2 -2
  82. package/dist/datavis.js +1 -1
  83. package/dist/esheet.cjs +5 -5
  84. package/dist/esheet.js +2 -2
  85. package/dist/index.cjs +151 -165
  86. package/dist/index.cjs.map +1 -1
  87. package/dist/index.d.cts +22 -2
  88. package/dist/index.d.ts +22 -2
  89. package/dist/index.js +22 -36
  90. package/dist/index.js.map +1 -1
  91. package/dist/styles.css +1 -1
  92. package/dist/tailwind-preset.cjs +4 -4
  93. package/dist/tailwind-preset.js +1 -1
  94. package/dist/templates.cjs +31 -31
  95. package/dist/templates.js +2 -2
  96. package/package.json +1 -1
  97. package/dist/chunk-6JSFT2J5.js.map +0 -1
  98. package/dist/chunk-BMSG4NBH.js +0 -56
  99. package/dist/chunk-BMSG4NBH.js.map +0 -1
  100. package/dist/chunk-CEQJGUAS.js.map +0 -1
  101. package/dist/chunk-I2MMUFCN.cjs.map +0 -1
  102. package/dist/chunk-LSMS6DY7.cjs.map +0 -1
  103. package/dist/chunk-MJJJDQ5P.cjs.map +0 -1
  104. package/dist/chunk-TKWNXAFI.js.map +0 -1
  105. package/dist/chunk-VNEAQCY2.js.map +0 -1
  106. package/dist/chunk-VPIYTQCV.cjs.map +0 -1
  107. package/dist/chunk-YVL3XATO.cjs +0 -79
  108. package/dist/chunk-YVL3XATO.cjs.map +0 -1
@@ -2,22 +2,22 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var chunkMJJJDQ5P_cjs = require('./chunk-MJJJDQ5P.cjs');
5
+ var chunk6WX2OR3U_cjs = require('./chunk-6WX2OR3U.cjs');
6
6
  require('./chunk-EUAMEVVI.cjs');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, "default", {
11
11
  enumerable: true,
12
- get: function () { return chunkMJJJDQ5P_cjs.tailwind_preset_default; }
12
+ get: function () { return chunk6WX2OR3U_cjs.tailwind_preset_default; }
13
13
  });
14
14
  Object.defineProperty(exports, "miewebUIPreset", {
15
15
  enumerable: true,
16
- get: function () { return chunkMJJJDQ5P_cjs.miewebUIPreset; }
16
+ get: function () { return chunk6WX2OR3U_cjs.miewebUIPreset; }
17
17
  });
18
18
  Object.defineProperty(exports, "miewebUISafelist", {
19
19
  enumerable: true,
20
- get: function () { return chunkMJJJDQ5P_cjs.miewebUISafelist; }
20
+ get: function () { return chunk6WX2OR3U_cjs.miewebUISafelist; }
21
21
  });
22
22
  //# sourceMappingURL=tailwind-preset.cjs.map
23
23
  //# sourceMappingURL=tailwind-preset.cjs.map
@@ -1,4 +1,4 @@
1
- export { tailwind_preset_default as default, miewebUIPreset, miewebUISafelist } from './chunk-TKWNXAFI.js';
1
+ export { tailwind_preset_default as default, miewebUIPreset, miewebUISafelist } from './chunk-FDA3R5E7.js';
2
2
  import './chunk-PX6F3LHL.js';
3
3
  //# sourceMappingURL=tailwind-preset.js.map
4
4
  //# sourceMappingURL=tailwind-preset.js.map
@@ -1,11 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var chunkADW7ZYCY_cjs = require('./chunk-ADW7ZYCY.cjs');
3
+ var chunkLRAAJRE7_cjs = require('./chunk-LRAAJRE7.cjs');
4
4
  require('./chunk-VBWRH4UW.cjs');
5
5
  var chunkXI74P5F2_cjs = require('./chunk-XI74P5F2.cjs');
6
6
  require('./chunk-I44YNYI6.cjs');
7
7
  require('./chunk-Z5S5JEJD.cjs');
8
- require('./chunk-YVL3XATO.cjs');
8
+ require('./chunk-7E46YDOT.cjs');
9
9
  require('./chunk-DXEPYK3I.cjs');
10
10
  require('./chunk-S5RVSXDV.cjs');
11
11
  require('./chunk-EUAMEVVI.cjs');
@@ -14,119 +14,119 @@ require('./chunk-EUAMEVVI.cjs');
14
14
 
15
15
  Object.defineProperty(exports, "BenchmarkTableSection", {
16
16
  enumerable: true,
17
- get: function () { return chunkADW7ZYCY_cjs.BenchmarkTableSection; }
17
+ get: function () { return chunkLRAAJRE7_cjs.BenchmarkTableSection; }
18
18
  });
19
19
  Object.defineProperty(exports, "ComparisonSection", {
20
20
  enumerable: true,
21
- get: function () { return chunkADW7ZYCY_cjs.ComparisonSection; }
21
+ get: function () { return chunkLRAAJRE7_cjs.ComparisonSection; }
22
22
  });
23
23
  Object.defineProperty(exports, "CtaSection", {
24
24
  enumerable: true,
25
- get: function () { return chunkADW7ZYCY_cjs.CtaSection; }
25
+ get: function () { return chunkLRAAJRE7_cjs.CtaSection; }
26
26
  });
27
27
  Object.defineProperty(exports, "FaqSection", {
28
28
  enumerable: true,
29
- get: function () { return chunkADW7ZYCY_cjs.FaqSection; }
29
+ get: function () { return chunkLRAAJRE7_cjs.FaqSection; }
30
30
  });
31
31
  Object.defineProperty(exports, "FeatureGridSection", {
32
32
  enumerable: true,
33
- get: function () { return chunkADW7ZYCY_cjs.FeatureGridSection; }
33
+ get: function () { return chunkLRAAJRE7_cjs.FeatureGridSection; }
34
34
  });
35
35
  Object.defineProperty(exports, "HeroSection", {
36
36
  enumerable: true,
37
- get: function () { return chunkADW7ZYCY_cjs.HeroSection; }
37
+ get: function () { return chunkLRAAJRE7_cjs.HeroSection; }
38
38
  });
39
39
  Object.defineProperty(exports, "LandingPage", {
40
40
  enumerable: true,
41
- get: function () { return chunkADW7ZYCY_cjs.LandingPage; }
41
+ get: function () { return chunkLRAAJRE7_cjs.LandingPage; }
42
42
  });
43
43
  Object.defineProperty(exports, "LeadFormSection", {
44
44
  enumerable: true,
45
- get: function () { return chunkADW7ZYCY_cjs.LeadFormSection; }
45
+ get: function () { return chunkLRAAJRE7_cjs.LeadFormSection; }
46
46
  });
47
47
  Object.defineProperty(exports, "LinkGroupsSection", {
48
48
  enumerable: true,
49
- get: function () { return chunkADW7ZYCY_cjs.LinkGroupsSection; }
49
+ get: function () { return chunkLRAAJRE7_cjs.LinkGroupsSection; }
50
50
  });
51
51
  Object.defineProperty(exports, "LogoCloudSection", {
52
52
  enumerable: true,
53
- get: function () { return chunkADW7ZYCY_cjs.LogoCloudSection; }
53
+ get: function () { return chunkLRAAJRE7_cjs.LogoCloudSection; }
54
54
  });
55
55
  Object.defineProperty(exports, "MetricListSection", {
56
56
  enumerable: true,
57
- get: function () { return chunkADW7ZYCY_cjs.MetricListSection; }
57
+ get: function () { return chunkLRAAJRE7_cjs.MetricListSection; }
58
58
  });
59
59
  Object.defineProperty(exports, "PdfEmbedSection", {
60
60
  enumerable: true,
61
- get: function () { return chunkADW7ZYCY_cjs.PdfEmbedSection; }
61
+ get: function () { return chunkLRAAJRE7_cjs.PdfEmbedSection; }
62
62
  });
63
63
  Object.defineProperty(exports, "PricingSection", {
64
64
  enumerable: true,
65
- get: function () { return chunkADW7ZYCY_cjs.PricingSection; }
65
+ get: function () { return chunkLRAAJRE7_cjs.PricingSection; }
66
66
  });
67
67
  Object.defineProperty(exports, "ProcessStepsSection", {
68
68
  enumerable: true,
69
- get: function () { return chunkADW7ZYCY_cjs.ProcessStepsSection; }
69
+ get: function () { return chunkLRAAJRE7_cjs.ProcessStepsSection; }
70
70
  });
71
71
  Object.defineProperty(exports, "RankedListSection", {
72
72
  enumerable: true,
73
- get: function () { return chunkADW7ZYCY_cjs.RankedListSection; }
73
+ get: function () { return chunkLRAAJRE7_cjs.RankedListSection; }
74
74
  });
75
75
  Object.defineProperty(exports, "ReportByline", {
76
76
  enumerable: true,
77
- get: function () { return chunkADW7ZYCY_cjs.ReportByline; }
77
+ get: function () { return chunkLRAAJRE7_cjs.ReportByline; }
78
78
  });
79
79
  Object.defineProperty(exports, "ReportLegend", {
80
80
  enumerable: true,
81
- get: function () { return chunkADW7ZYCY_cjs.ReportLegend; }
81
+ get: function () { return chunkLRAAJRE7_cjs.ReportLegend; }
82
82
  });
83
83
  Object.defineProperty(exports, "ReportMethodology", {
84
84
  enumerable: true,
85
- get: function () { return chunkADW7ZYCY_cjs.ReportMethodology; }
85
+ get: function () { return chunkLRAAJRE7_cjs.ReportMethodology; }
86
86
  });
87
87
  Object.defineProperty(exports, "ResourceCardsSection", {
88
88
  enumerable: true,
89
- get: function () { return chunkADW7ZYCY_cjs.ResourceCardsSection; }
89
+ get: function () { return chunkLRAAJRE7_cjs.ResourceCardsSection; }
90
90
  });
91
91
  Object.defineProperty(exports, "SplitContentSection", {
92
92
  enumerable: true,
93
- get: function () { return chunkADW7ZYCY_cjs.SplitContentSection; }
93
+ get: function () { return chunkLRAAJRE7_cjs.SplitContentSection; }
94
94
  });
95
95
  Object.defineProperty(exports, "StatsSection", {
96
96
  enumerable: true,
97
- get: function () { return chunkADW7ZYCY_cjs.StatsSection; }
97
+ get: function () { return chunkLRAAJRE7_cjs.StatsSection; }
98
98
  });
99
99
  Object.defineProperty(exports, "TestimonialSection", {
100
100
  enumerable: true,
101
- get: function () { return chunkADW7ZYCY_cjs.TestimonialSection; }
101
+ get: function () { return chunkLRAAJRE7_cjs.TestimonialSection; }
102
102
  });
103
103
  Object.defineProperty(exports, "TileCartogramSection", {
104
104
  enumerable: true,
105
- get: function () { return chunkADW7ZYCY_cjs.TileCartogramSection; }
105
+ get: function () { return chunkLRAAJRE7_cjs.TileCartogramSection; }
106
106
  });
107
107
  Object.defineProperty(exports, "VideoSection", {
108
108
  enumerable: true,
109
- get: function () { return chunkADW7ZYCY_cjs.VideoSection; }
109
+ get: function () { return chunkLRAAJRE7_cjs.VideoSection; }
110
110
  });
111
111
  Object.defineProperty(exports, "defaultLeadFormFields", {
112
112
  enumerable: true,
113
- get: function () { return chunkADW7ZYCY_cjs.defaultLeadFormFields; }
113
+ get: function () { return chunkLRAAJRE7_cjs.defaultLeadFormFields; }
114
114
  });
115
115
  Object.defineProperty(exports, "landingPresets", {
116
116
  enumerable: true,
117
- get: function () { return chunkADW7ZYCY_cjs.landingPresets; }
117
+ get: function () { return chunkLRAAJRE7_cjs.landingPresets; }
118
118
  });
119
119
  Object.defineProperty(exports, "quartileBuckets", {
120
120
  enumerable: true,
121
- get: function () { return chunkADW7ZYCY_cjs.quartileBuckets; }
121
+ get: function () { return chunkLRAAJRE7_cjs.quartileBuckets; }
122
122
  });
123
123
  Object.defineProperty(exports, "usStateTiles", {
124
124
  enumerable: true,
125
- get: function () { return chunkADW7ZYCY_cjs.usStateTiles; }
125
+ get: function () { return chunkLRAAJRE7_cjs.usStateTiles; }
126
126
  });
127
127
  Object.defineProperty(exports, "validateLandingPage", {
128
128
  enumerable: true,
129
- get: function () { return chunkADW7ZYCY_cjs.validateLandingPage; }
129
+ get: function () { return chunkLRAAJRE7_cjs.validateLandingPage; }
130
130
  });
131
131
  Object.defineProperty(exports, "MetricStatusBadge", {
132
132
  enumerable: true,
package/dist/templates.js CHANGED
@@ -1,9 +1,9 @@
1
- export { BenchmarkTableSection, ComparisonSection, CtaSection, FaqSection, FeatureGridSection, HeroSection, LandingPage, LeadFormSection, LinkGroupsSection, LogoCloudSection, MetricListSection, PdfEmbedSection, PricingSection, ProcessStepsSection, RankedListSection, ReportByline, ReportLegend, ReportMethodology, ResourceCardsSection, SplitContentSection, StatsSection, TestimonialSection, TileCartogramSection, VideoSection, defaultLeadFormFields, landingPresets, quartileBuckets, usStateTiles, validateLandingPage } from './chunk-T4JYUICS.js';
1
+ export { BenchmarkTableSection, ComparisonSection, CtaSection, FaqSection, FeatureGridSection, HeroSection, LandingPage, LeadFormSection, LinkGroupsSection, LogoCloudSection, MetricListSection, PdfEmbedSection, PricingSection, ProcessStepsSection, RankedListSection, ReportByline, ReportLegend, ReportMethodology, ResourceCardsSection, SplitContentSection, StatsSection, TestimonialSection, TileCartogramSection, VideoSection, defaultLeadFormFields, landingPresets, quartileBuckets, usStateTiles, validateLandingPage } from './chunk-Y7ZJZLJY.js';
2
2
  import './chunk-IQ4KQJAO.js';
3
3
  export { MetricStatusBadge, SectionHeading, SectionShell, TemplateIcon, defaultMetricStatusLabels, templateIcons } from './chunk-FBCDYTWM.js';
4
4
  import './chunk-6NZXWKUE.js';
5
5
  import './chunk-3IMM2PM4.js';
6
- import './chunk-BMSG4NBH.js';
6
+ import './chunk-522WJIVI.js';
7
7
  import './chunk-GVM6DTR5.js';
8
8
  import './chunk-TQONQSJO.js';
9
9
  import './chunk-PX6F3LHL.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mieweb/ui",
3
- "version": "0.10.0-dev.33",
3
+ "version": "0.10.0-dev.35",
4
4
  "description": "A themeable, accessible React component library built with Tailwind CSS",
5
5
  "author": "Medical Informatics Engineering, Inc.",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/CompletenessMeter/CompletenessMeter.tsx"],"names":["CompletenessMeter"],"mappings":"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","file":"chunk-6JSFT2J5.js","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface CompletenessField {\n /** Stable key, passed back to `onFieldClick`. */\n key: string;\n /** Display name of the field. */\n label: string;\n /** Whether the field has a value. */\n complete: boolean;\n /** Relative importance; defaults to 1. */\n weight?: number;\n}\n\nexport interface CompletenessMeterLabels {\n /** Heading of the full variant. */\n title: string;\n /** Accessible name of the progress bar. */\n progress: string;\n /** Visible percentage and `aria-valuetext`. */\n percent: (percent: number) => string;\n /** Heading of the missing-fields list. */\n missing: (count: number) => string;\n /** Shown when nothing is missing. */\n allComplete: string;\n}\n\nexport const defaultCompletenessMeterLabels: CompletenessMeterLabels = {\n title: 'Data completeness',\n progress: 'Data completeness',\n percent: (percent) => `${percent}%`,\n missing: (count) => `Missing (${count})`,\n allComplete: 'All fields complete',\n};\n\n/** Weighted completion percentage (0–100) and the incomplete fields. */\nexport function getCompleteness(fields: CompletenessField[]) {\n let total = 0;\n let done = 0;\n for (const f of fields) {\n const w =\n f.weight === undefined\n ? 1\n : Number.isFinite(f.weight)\n ? Math.max(0, f.weight)\n : 0;\n total += w;\n if (f.complete) done += w;\n }\n return {\n percent: total > 0 ? Math.round((done / total) * 100) : 100,\n missing: fields.filter((f) => !f.complete),\n };\n}\n\nfunction tone(percent: number) {\n if (percent >= 80) return 'bg-success-500';\n if (percent >= 50) return 'bg-warning-500';\n return 'bg-destructive-500';\n}\n\nexport interface CompletenessMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Fields that make up the record. */\n fields: CompletenessField[];\n /** `compact` shows the bar and percentage only. */\n variant?: 'default' | 'compact';\n /** Makes each missing field a button, e.g. to focus its input. */\n onFieldClick?: (key: string) => void;\n /** Overrides for any user-facing string. */\n labels?: Partial<CompletenessMeterLabels>;\n}\n\n/**\n * How complete a record is: a weighted percentage, a progress bar and the\n * list of missing fields.\n *\n * @example\n * ```tsx\n * <CompletenessMeter fields={fields} onFieldClick={(key) => focusField(key)} />\n * ```\n */\nexport const CompletenessMeter = React.forwardRef<\n HTMLDivElement,\n CompletenessMeterProps\n>(function CompletenessMeter(\n {\n fields,\n variant = 'default',\n onFieldClick,\n labels: labelOverrides,\n className,\n ...props\n },\n ref\n) {\n const labels = { ...defaultCompletenessMeterLabels, ...labelOverrides };\n const { percent, missing } = getCompleteness(fields);\n const titleId = React.useId();\n const compact = variant === 'compact';\n\n const bar = (\n <div className=\"flex items-center gap-2\">\n <div\n role=\"progressbar\"\n aria-valuenow={percent}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuetext={labels.percent(percent)}\n aria-label={labels.progress}\n data-slot=\"completeness-meter-bar\"\n className={cn(\n 'bg-muted h-2 overflow-hidden rounded-full',\n compact ? 'w-24' : 'flex-1'\n )}\n >\n <div\n className={cn(\n 'h-full rounded-full motion-safe:transition-[width] motion-safe:duration-300',\n tone(percent)\n )}\n style={{ width: `${percent}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs font-medium tabular-nums\">\n {labels.percent(percent)}\n </span>\n </div>\n );\n\n if (compact) {\n return (\n <div\n ref={ref}\n data-slot=\"completeness-meter\"\n className={cn('inline-flex', className)}\n {...props}\n >\n {bar}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={titleId}\n data-slot=\"completeness-meter\"\n className={cn('flex flex-col gap-2 text-sm', className)}\n {...props}\n >\n <h3 id={titleId} className=\"text-foreground text-sm font-semibold\">\n {labels.title}\n </h3>\n {bar}\n {missing.length === 0 ? (\n <p className=\"text-success-700 dark:text-success-400 text-xs\">\n {labels.allComplete}\n </p>\n ) : (\n <div>\n <p className=\"text-muted-foreground mb-1 text-xs\">\n {labels.missing(missing.length)}\n </p>\n <ul\n className=\"flex flex-col gap-1\"\n data-slot=\"completeness-meter-missing\"\n >\n {missing.map((f) => (\n <li key={f.key} className=\"flex items-center gap-1.5 text-xs\">\n <span\n aria-hidden=\"true\"\n className=\"bg-destructive-500 h-1.5 w-1.5 shrink-0 rounded-full\"\n />\n {onFieldClick ? (\n <button\n type=\"button\"\n onClick={() => onFieldClick(f.key)}\n className=\"text-foreground decoration-primary-500 focus-visible:ring-ring rounded-sm text-start underline underline-offset-2 hover:decoration-2 focus-visible:ring-2 focus-visible:outline-none\"\n >\n {f.label}\n </button>\n ) : (\n <span className=\"text-foreground\">{f.label}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n});\n"]}
@@ -1,56 +0,0 @@
1
- import { cn } from './chunk-TQONQSJO.js';
2
- import * as React from 'react';
3
- import { cva } from 'class-variance-authority';
4
- import { jsxs, jsx } from 'react/jsx-runtime';
5
-
6
- var badgeVariants = cva(
7
- [
8
- "inline-flex items-center justify-center",
9
- "font-medium",
10
- "rounded-full",
11
- "transition-colors duration-150"
12
- ],
13
- {
14
- variants: {
15
- variant: {
16
- default: "bg-primary-100 text-primary-900 dark:bg-primary-900 dark:text-primary-100",
17
- secondary: "bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100",
18
- success: "bg-green-100 text-green-900 dark:bg-green-900 dark:text-green-100",
19
- warning: "bg-yellow-100 text-yellow-900 dark:bg-yellow-900 dark:text-yellow-100",
20
- danger: "bg-red-100 text-red-900 dark:bg-red-900 dark:text-red-100",
21
- outline: "border border-current bg-transparent"
22
- },
23
- size: {
24
- sm: "px-2 py-0.5 text-xs",
25
- md: "px-2.5 py-0.5 text-sm",
26
- lg: "px-3 py-1 text-base"
27
- }
28
- },
29
- defaultVariants: {
30
- variant: "default",
31
- size: "md"
32
- }
33
- }
34
- );
35
- var Badge = React.forwardRef(
36
- ({ className, variant, size, icon, children, ...props }, ref) => {
37
- return /* @__PURE__ */ jsxs(
38
- "span",
39
- {
40
- ref,
41
- "data-slot": "badge",
42
- className: cn(badgeVariants({ variant, size }), className),
43
- ...props,
44
- children: [
45
- icon && /* @__PURE__ */ jsx("span", { className: "me-1 shrink-0", children: icon }),
46
- children
47
- ]
48
- }
49
- );
50
- }
51
- );
52
- Badge.displayName = "Badge";
53
-
54
- export { Badge, badgeVariants };
55
- //# sourceMappingURL=chunk-BMSG4NBH.js.map
56
- //# sourceMappingURL=chunk-BMSG4NBH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Badge/Badge.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,aAAA,GAAgB,GAAA;AAAA,EACpB;AAAA,IACE,yCAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EACE,2EAAA;AAAA,QACF,SAAA,EACE,2EAAA;AAAA,QACF,OAAA,EACE,mEAAA;AAAA,QACF,OAAA,EACE,uEAAA;AAAA,QACF,MAAA,EAAQ,2DAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,uBAAA;AAAA,QACJ,EAAA,EAAI;AAAA;AACN,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAoBA,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,MAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/D,IAAA,uBACE,IAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,GAAG,aAAA,CAAc,EAAE,SAAS,IAAA,EAAM,GAAG,SAAS,CAAA;AAAA,QACxD,GAAG,KAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,IAAA,oBAAQ,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UAC9C;AAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-BMSG4NBH.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst badgeVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'font-medium',\n 'rounded-full',\n 'transition-colors duration-150',\n ],\n {\n variants: {\n variant: {\n default:\n 'bg-primary-100 text-primary-900 dark:bg-primary-900 dark:text-primary-100',\n secondary:\n 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-neutral-100',\n success:\n 'bg-green-100 text-green-900 dark:bg-green-900 dark:text-green-100',\n warning:\n 'bg-yellow-100 text-yellow-900 dark:bg-yellow-900 dark:text-yellow-100',\n danger: 'bg-red-100 text-red-900 dark:bg-red-900 dark:text-red-100',\n outline: 'border border-current bg-transparent',\n },\n size: {\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2.5 py-0.5 text-sm',\n lg: 'px-3 py-1 text-base',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n);\n\nexport interface BadgeProps\n extends\n React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {\n /** Optional icon before the text */\n icon?: React.ReactNode;\n}\n\n/**\n * A badge component for displaying status, labels, or counts.\n *\n * @example\n * ```tsx\n * <Badge variant=\"success\">Active</Badge>\n * <Badge variant=\"warning\" size=\"sm\">Pending</Badge>\n * <Badge variant=\"danger\" icon={<AlertIcon />}>Error</Badge>\n * ```\n */\nconst Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, size, icon, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n className={cn(badgeVariants({ variant, size }), className)}\n {...props}\n >\n {icon && <span className=\"me-1 shrink-0\">{icon}</span>}\n {children}\n </span>\n );\n }\n);\n\nBadge.displayName = 'Badge';\n\nexport { Badge, badgeVariants };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Progress/Progress.tsx"],"names":[],"mappings":"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","file":"chunk-CEQJGUAS.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Progress Bar Variants\n// ============================================================================\n\nconst progressBarTrackVariants = cva(\n ['w-full overflow-hidden rounded-full bg-neutral-200 dark:bg-neutral-700'],\n {\n variants: {\n size: {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n xl: 'h-4',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n }\n);\n\nconst progressBarFillVariants = cva(\n ['h-full rounded-full transition-all duration-300 ease-out'],\n {\n variants: {\n variant: {\n default: 'bg-primary-800',\n success: 'bg-green-500',\n warning: 'bg-yellow-500',\n danger: 'bg-red-500',\n },\n animated: {\n true: 'animate-pulse',\n false: '',\n },\n striped: {\n true: [\n 'bg-gradient-to-r',\n 'from-transparent via-white/20 to-transparent',\n 'bg-[length:1rem_100%]',\n 'animate-[progress-stripes_1s_linear_infinite]',\n ],\n false: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n animated: false,\n striped: false,\n },\n }\n);\n\n// ============================================================================\n// Progress Bar Component\n// ============================================================================\n\nexport interface ProgressProps\n extends\n VariantProps<typeof progressBarTrackVariants>,\n VariantProps<typeof progressBarFillVariants> {\n /** Current progress value (0-100) */\n value: number;\n /** Maximum value (default: 100) */\n max?: number;\n /** Label for the progress bar */\n label?: string;\n /** Show the percentage value */\n showValue?: boolean;\n /** Format the displayed value */\n formatValue?: (value: number, max: number) => string;\n /** Additional class name */\n className?: string;\n /** Whether the progress is indeterminate */\n indeterminate?: boolean;\n}\n\n/**\n * A progress bar component for showing completion status.\n *\n * @example\n * ```tsx\n * <Progress value={60} />\n * <Progress value={75} showValue label=\"Upload progress\" />\n * <Progress value={30} variant=\"success\" striped />\n * ```\n */\nfunction Progress({\n value,\n max = 100,\n label,\n showValue = false,\n formatValue,\n size,\n variant,\n animated,\n striped,\n className,\n indeterminate = false,\n}: ProgressProps) {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n const progressId = React.useId();\n\n const displayValue = formatValue\n ? formatValue(value, max)\n : `${Math.round(percentage)}%`;\n\n return (\n <div data-slot=\"progress\" className={cn('w-full', className)}>\n {(label || showValue) && (\n <div\n data-slot=\"progress-label-row\"\n className=\"mb-1.5 flex items-center justify-between\"\n >\n {label && (\n <label\n data-slot=\"progress-label\"\n id={`${progressId}-label`}\n className=\"text-foreground text-sm font-medium\"\n >\n {label}\n </label>\n )}\n {showValue && !indeterminate && (\n <span\n data-slot=\"progress-value\"\n className=\"text-sm text-neutral-600 dark:text-neutral-400\"\n >\n {displayValue}\n </span>\n )}\n </div>\n )}\n <div\n data-slot=\"progress-track\"\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-labelledby={label ? `${progressId}-label` : undefined}\n aria-label={!label ? 'Progress' : undefined}\n className={cn(progressBarTrackVariants({ size }))}\n >\n <div\n data-slot=\"progress-fill\"\n className={cn(\n progressBarFillVariants({ variant, animated, striped }),\n indeterminate &&\n 'w-1/3 animate-[indeterminate_1.5s_ease-in-out_infinite]',\n !striped && variant === 'default' && 'bg-primary-800',\n !striped && variant === 'success' && 'bg-green-500',\n !striped && variant === 'warning' && 'bg-yellow-500',\n !striped && variant === 'danger' && 'bg-red-500'\n )}\n style={indeterminate ? undefined : { width: `${percentage}%` }}\n />\n </div>\n </div>\n );\n}\n\nProgress.displayName = 'Progress';\n\n// ============================================================================\n// Circular Progress Variants\n// ============================================================================\n\nconst circularProgressVariants = cva(['relative inline-flex'], {\n variants: {\n size: {\n sm: 'h-8 w-8',\n md: 'h-12 w-12',\n lg: 'h-16 w-16',\n xl: 'h-24 w-24',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\n// ============================================================================\n// Circular Progress Component\n// ============================================================================\n\nexport interface CircularProgressProps extends VariantProps<\n typeof circularProgressVariants\n> {\n /** Current progress value (0-100) */\n value: number;\n /** Maximum value (default: 100) */\n max?: number;\n /** Color variant */\n variant?: 'default' | 'success' | 'warning' | 'danger';\n /** Stroke width */\n strokeWidth?: number;\n /** Show the percentage value in the center */\n showValue?: boolean;\n /** Whether the progress is indeterminate */\n indeterminate?: boolean;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * A circular progress indicator component.\n *\n * @example\n * ```tsx\n * <CircularProgress value={75} showValue />\n * <CircularProgress value={50} variant=\"success\" size=\"lg\" />\n * ```\n */\nfunction CircularProgress({\n value,\n max = 100,\n variant = 'default',\n size,\n strokeWidth = 4,\n showValue = false,\n indeterminate = false,\n className,\n}: CircularProgressProps) {\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n\n // SVG calculations\n const sizeMap = { sm: 32, md: 48, lg: 64, xl: 96 };\n const svgSize = sizeMap[size || 'md'];\n const radius = (svgSize - strokeWidth) / 2;\n const circumference = 2 * Math.PI * radius;\n const offset = circumference - (percentage / 100) * circumference;\n\n const variantColors = {\n default: 'stroke-primary-500',\n success: 'stroke-green-500',\n warning: 'stroke-yellow-500',\n danger: 'stroke-red-500',\n };\n\n return (\n <div\n data-slot=\"circular-progress\"\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : value}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-label=\"Progress\"\n className={cn(circularProgressVariants({ size }), className)}\n >\n <svg\n aria-hidden=\"true\"\n className={cn('-rotate-90 transform', indeterminate && 'animate-spin')}\n width={svgSize}\n height={svgSize}\n >\n {/* Background track */}\n <circle\n className=\"stroke-neutral-200 dark:stroke-neutral-700\"\n fill=\"none\"\n strokeWidth={strokeWidth}\n cx={svgSize / 2}\n cy={svgSize / 2}\n r={radius}\n />\n {/* Progress fill */}\n <circle\n className={cn(\n variantColors[variant],\n 'transition-all duration-300 ease-out'\n )}\n fill=\"none\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n cx={svgSize / 2}\n cy={svgSize / 2}\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={indeterminate ? circumference * 0.75 : offset}\n />\n </svg>\n {showValue && !indeterminate && (\n <span\n data-slot=\"circular-progress-value\"\n className=\"text-foreground absolute inset-0 flex items-center justify-center text-xs font-medium\"\n >\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n );\n}\n\nCircularProgress.displayName = 'CircularProgress';\n\nexport {\n Progress,\n CircularProgress,\n progressBarTrackVariants,\n progressBarFillVariants,\n circularProgressVariants,\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/CompletenessMeter/CompletenessMeter.tsx"],"names":["React","CompletenessMeter","jsxs","jsx","cn"],"mappings":"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","file":"chunk-I2MMUFCN.cjs","sourcesContent":["import * as React from 'react';\nimport { cn } from '../../utils/cn';\n\nexport interface CompletenessField {\n /** Stable key, passed back to `onFieldClick`. */\n key: string;\n /** Display name of the field. */\n label: string;\n /** Whether the field has a value. */\n complete: boolean;\n /** Relative importance; defaults to 1. */\n weight?: number;\n}\n\nexport interface CompletenessMeterLabels {\n /** Heading of the full variant. */\n title: string;\n /** Accessible name of the progress bar. */\n progress: string;\n /** Visible percentage and `aria-valuetext`. */\n percent: (percent: number) => string;\n /** Heading of the missing-fields list. */\n missing: (count: number) => string;\n /** Shown when nothing is missing. */\n allComplete: string;\n}\n\nexport const defaultCompletenessMeterLabels: CompletenessMeterLabels = {\n title: 'Data completeness',\n progress: 'Data completeness',\n percent: (percent) => `${percent}%`,\n missing: (count) => `Missing (${count})`,\n allComplete: 'All fields complete',\n};\n\n/** Weighted completion percentage (0–100) and the incomplete fields. */\nexport function getCompleteness(fields: CompletenessField[]) {\n let total = 0;\n let done = 0;\n for (const f of fields) {\n const w =\n f.weight === undefined\n ? 1\n : Number.isFinite(f.weight)\n ? Math.max(0, f.weight)\n : 0;\n total += w;\n if (f.complete) done += w;\n }\n return {\n percent: total > 0 ? Math.round((done / total) * 100) : 100,\n missing: fields.filter((f) => !f.complete),\n };\n}\n\nfunction tone(percent: number) {\n if (percent >= 80) return 'bg-success-500';\n if (percent >= 50) return 'bg-warning-500';\n return 'bg-destructive-500';\n}\n\nexport interface CompletenessMeterProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Fields that make up the record. */\n fields: CompletenessField[];\n /** `compact` shows the bar and percentage only. */\n variant?: 'default' | 'compact';\n /** Makes each missing field a button, e.g. to focus its input. */\n onFieldClick?: (key: string) => void;\n /** Overrides for any user-facing string. */\n labels?: Partial<CompletenessMeterLabels>;\n}\n\n/**\n * How complete a record is: a weighted percentage, a progress bar and the\n * list of missing fields.\n *\n * @example\n * ```tsx\n * <CompletenessMeter fields={fields} onFieldClick={(key) => focusField(key)} />\n * ```\n */\nexport const CompletenessMeter = React.forwardRef<\n HTMLDivElement,\n CompletenessMeterProps\n>(function CompletenessMeter(\n {\n fields,\n variant = 'default',\n onFieldClick,\n labels: labelOverrides,\n className,\n ...props\n },\n ref\n) {\n const labels = { ...defaultCompletenessMeterLabels, ...labelOverrides };\n const { percent, missing } = getCompleteness(fields);\n const titleId = React.useId();\n const compact = variant === 'compact';\n\n const bar = (\n <div className=\"flex items-center gap-2\">\n <div\n role=\"progressbar\"\n aria-valuenow={percent}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuetext={labels.percent(percent)}\n aria-label={labels.progress}\n data-slot=\"completeness-meter-bar\"\n className={cn(\n 'bg-muted h-2 overflow-hidden rounded-full',\n compact ? 'w-24' : 'flex-1'\n )}\n >\n <div\n className={cn(\n 'h-full rounded-full motion-safe:transition-[width] motion-safe:duration-300',\n tone(percent)\n )}\n style={{ width: `${percent}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs font-medium tabular-nums\">\n {labels.percent(percent)}\n </span>\n </div>\n );\n\n if (compact) {\n return (\n <div\n ref={ref}\n data-slot=\"completeness-meter\"\n className={cn('inline-flex', className)}\n {...props}\n >\n {bar}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n role=\"group\"\n aria-labelledby={titleId}\n data-slot=\"completeness-meter\"\n className={cn('flex flex-col gap-2 text-sm', className)}\n {...props}\n >\n <h3 id={titleId} className=\"text-foreground text-sm font-semibold\">\n {labels.title}\n </h3>\n {bar}\n {missing.length === 0 ? (\n <p className=\"text-success-700 dark:text-success-400 text-xs\">\n {labels.allComplete}\n </p>\n ) : (\n <div>\n <p className=\"text-muted-foreground mb-1 text-xs\">\n {labels.missing(missing.length)}\n </p>\n <ul\n className=\"flex flex-col gap-1\"\n data-slot=\"completeness-meter-missing\"\n >\n {missing.map((f) => (\n <li key={f.key} className=\"flex items-center gap-1.5 text-xs\">\n <span\n aria-hidden=\"true\"\n className=\"bg-destructive-500 h-1.5 w-1.5 shrink-0 rounded-full\"\n />\n {onFieldClick ? (\n <button\n type=\"button\"\n onClick={() => onFieldClick(f.key)}\n className=\"text-foreground decoration-primary-500 focus-visible:ring-ring rounded-sm text-start underline underline-offset-2 hover:decoration-2 focus-visible:ring-2 focus-visible:outline-none\"\n >\n {f.label}\n </button>\n ) : (\n <span className=\"text-foreground\">{f.label}</span>\n )}\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n});\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/TagEditor/TagEditor.tsx"],"names":["cva","React","TagEditor","useAnchoredPosition","useClickOutside","jsxs","cn","jsx","X","Loader2","createPortal"],"mappings":"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","file":"chunk-LSMS6DY7.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Loader2, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useClickOutside } from '../../hooks/useClickOutside';\n\nexport interface TagEditorLabels {\n /** Accessible name of the text input when no visible `label` is given. */\n input: string;\n placeholder: string;\n remove: (tag: string) => string;\n duplicate: (tag: string) => string;\n maxReached: (max: number) => string;\n saving: string;\n saveFailed: string;\n /** Accessible name of the suggestions list. */\n suggestions: string;\n}\n\nexport const defaultTagEditorLabels: TagEditorLabels = {\n input: 'Add tag',\n placeholder: 'Add a tag…',\n remove: (tag) => `Remove ${tag}`,\n duplicate: (tag) => `\"${tag}\" is already added`,\n maxReached: (max) => `You can add up to ${max} tags`,\n saving: 'Saving…',\n saveFailed: 'Could not save tags. Try again.',\n suggestions: 'Suggestions',\n};\n\nconst containerVariants = cva(\n [\n 'flex w-full flex-wrap items-center gap-1.5 rounded-lg border bg-background',\n 'focus-within:ring-ring focus-within:ring-2',\n ],\n {\n variants: {\n size: { sm: 'min-h-8 px-2 py-1 text-sm', md: 'min-h-10 px-3 py-1.5' },\n hasError: { true: 'border-destructive', false: 'border-input' },\n },\n defaultVariants: { size: 'md', hasError: false },\n }\n);\n\nexport interface TagEditorProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'>,\n Omit<VariantProps<typeof containerVariants>, 'hasError'> {\n /** Current tags (controlled). */\n value: string[];\n /** Receives the next tag list. May return a promise; a rejection shows an error. */\n onChange: (tags: string[]) => void | Promise<void>;\n /** Optional values offered while typing. */\n suggestions?: string[];\n /** Maximum number of tags. */\n maxTags?: number;\n /** Return an error message to reject a tag. */\n validate?: (tag: string) => string | undefined;\n /** Visible label for the field. */\n label?: string;\n readOnly?: boolean;\n disabled?: boolean;\n /** Translatable strings. */\n labels?: Partial<TagEditorLabels>;\n}\n\n/**\n * Edit a list of free-form tags: chips with remove buttons plus an input that\n * adds on Enter or comma, with optional suggestions.\n */\nexport const TagEditor = React.forwardRef<HTMLDivElement, TagEditorProps>(\n function TagEditor(\n {\n value,\n onChange,\n suggestions,\n maxTags,\n validate,\n label,\n readOnly,\n disabled,\n size,\n labels: labelOverrides,\n className,\n ...props\n },\n ref\n ) {\n const labels = { ...defaultTagEditorLabels, ...labelOverrides };\n const [draft, setDraft] = React.useState('');\n const [error, setError] = React.useState<string | null>(null);\n const [pending, setPending] = React.useState(false);\n const [open, setOpen] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState(-1);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const id = React.useId();\n const inputId = `${id}-input`;\n const errorId = `${id}-error`;\n const listId = `${id}-list`;\n\n const { anchorRef, floatingRef, style } = useAnchoredPosition<\n HTMLDivElement,\n HTMLDivElement\n >({ open, matchWidth: true, maxHeight: 240 });\n const outsideRefs = React.useMemo(\n () => [containerRef, floatingRef],\n [floatingRef]\n );\n useClickOutside(outsideRefs, () => setOpen(false), open);\n\n const has = (tag: string) =>\n value.some((t) => t.toLowerCase() === tag.toLowerCase());\n const query = draft.trim().toLowerCase();\n const matches = (suggestions ?? []).filter(\n (s) => !has(s) && (!query || s.toLowerCase().includes(query))\n );\n const isOpen = open && matches.length > 0 && !pending;\n const interactive = !readOnly && !disabled && !pending;\n const atMax = maxTags !== undefined && value.length >= maxTags;\n // State lags a render behind; the ref blocks a second save from the same tick.\n const inFlight = React.useRef(false);\n\n const commit = async (next: string[], refocus = true) => {\n inFlight.current = true;\n setPending(true);\n try {\n await onChange(next);\n } catch {\n setError(labels.saveFailed);\n } finally {\n inFlight.current = false;\n setPending(false);\n if (refocus) inputRef.current?.focus();\n }\n };\n\n const add = (raw: string[], refocus = true) => {\n if (inFlight.current) return;\n const next = [...value];\n for (const piece of raw) {\n const tag = piece.trim();\n if (!tag) continue;\n if (next.some((t) => t.toLowerCase() === tag.toLowerCase())) {\n setError(labels.duplicate(tag));\n return;\n }\n if (maxTags !== undefined && next.length >= maxTags) {\n setError(labels.maxReached(maxTags));\n return;\n }\n const invalid = validate?.(tag);\n if (invalid) {\n setError(invalid);\n return;\n }\n next.push(tag);\n }\n setError(null);\n setDraft('');\n setActiveIndex(-1);\n if (next.length !== value.length) void commit(next, refocus);\n };\n\n const remove = (index: number) => {\n if (inFlight.current) return;\n setError(null);\n void commit(value.filter((_, i) => i !== index));\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n setOpen(true);\n if (!matches.length) return;\n const step = e.key === 'ArrowDown' ? 1 : -1;\n setActiveIndex((i) => (i + step + matches.length) % matches.length);\n } else if (e.key === 'Enter' || e.key === ',') {\n if (e.key === 'Enter' && !draft.trim() && activeIndex < 0) return;\n e.preventDefault();\n add([isOpen && activeIndex >= 0 ? matches[activeIndex] : draft]);\n } else if (e.key === 'Backspace' && !draft && value.length) {\n remove(value.length - 1);\n } else if (e.key === 'Escape' && isOpen) {\n e.preventDefault();\n setOpen(false);\n setActiveIndex(-1);\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const parts = e.target.value.split(',');\n setOpen(true);\n setActiveIndex(-1);\n if (parts.length > 1) {\n add(parts.slice(0, -1));\n setDraft(parts[parts.length - 1]);\n } else {\n setDraft(e.target.value);\n if (error) setError(null);\n }\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"tag-editor\"\n className={cn('w-full', className)}\n {...props}\n >\n {label && (\n <label\n htmlFor={inputId}\n className=\"text-foreground mb-1.5 block text-sm font-medium\"\n >\n {label}\n </label>\n )}\n <div\n ref={(node) => {\n containerRef.current = node;\n anchorRef.current = node;\n }}\n data-slot=\"tag-editor-field\"\n aria-busy={pending || undefined}\n className={cn(\n containerVariants({ size, hasError: !!error }),\n disabled && 'cursor-not-allowed opacity-50',\n readOnly && 'focus-within:ring-0'\n )}\n >\n {value.length > 0 && (\n <ul\n aria-label={label ?? labels.input}\n className=\"flex max-w-full flex-wrap items-center gap-1.5\"\n >\n {value.map((tag, index) => (\n <li\n key={tag}\n data-slot=\"tag-editor-tag\"\n className=\"bg-primary-100 text-primary-900 dark:bg-primary-900 dark:text-primary-100 inline-flex max-w-full items-center gap-1 rounded-full py-0.5 ps-2.5 pe-1 text-sm\"\n >\n <span className=\"truncate\">{tag}</span>\n {!readOnly && (\n <button\n type=\"button\"\n aria-label={labels.remove(tag)}\n disabled={!interactive}\n onClick={(e) => {\n e.stopPropagation();\n remove(index);\n }}\n className=\"hover:bg-primary-200 dark:hover:bg-primary-800 focus-visible:ring-ring rounded-full p-0.5 focus-visible:ring-2 focus-visible:outline-none disabled:opacity-50\"\n >\n <X aria-hidden=\"true\" className=\"h-3 w-3\" />\n </button>\n )}\n </li>\n ))}\n </ul>\n )}\n {!readOnly && (\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n aria-label={label ? undefined : labels.input}\n aria-expanded={isOpen}\n aria-controls={suggestions ? listId : undefined}\n aria-autocomplete=\"list\"\n aria-activedescendant={\n isOpen && activeIndex >= 0\n ? `${listId}-${activeIndex}`\n : undefined\n }\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n autoComplete=\"off\"\n value={draft}\n placeholder={atMax ? undefined : labels.placeholder}\n disabled={disabled}\n readOnly={pending || atMax}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={() => setOpen(true)}\n onBlur={() => {\n setOpen(false);\n if (draft.trim()) add([draft], false);\n }}\n className=\"placeholder:text-muted-foreground text-foreground min-w-24 flex-1 bg-transparent py-0.5 outline-none disabled:cursor-not-allowed\"\n />\n )}\n {pending && (\n <span role=\"status\" className=\"inline-flex\">\n <Loader2\n aria-hidden=\"true\"\n className=\"text-muted-foreground h-4 w-4 animate-spin motion-reduce:animate-none\"\n />\n <span className=\"sr-only\">{labels.saving}</span>\n </span>\n )}\n </div>\n {error && (\n <p\n id={errorId}\n role=\"alert\"\n data-slot=\"tag-editor-error\"\n className=\"text-destructive-700 dark:text-destructive-400 mt-1 text-sm\"\n >\n {error}\n </p>\n )}\n {isOpen &&\n createPortal(\n <div\n ref={floatingRef}\n style={style}\n id={listId}\n role=\"listbox\"\n aria-label={labels.suggestions}\n data-slot=\"tag-editor-suggestions\"\n className=\"border-border bg-card text-card-foreground overflow-auto rounded-md border py-1 shadow-lg\"\n >\n {matches.map((s, i) => (\n <button\n key={s}\n type=\"button\"\n tabIndex={-1}\n id={`${listId}-${i}`}\n role=\"option\"\n aria-selected={i === activeIndex}\n onMouseEnter={() => setActiveIndex(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => add([s])}\n className={cn(\n 'block w-full px-3 py-2 text-start text-sm',\n i === activeIndex ? 'bg-muted' : 'hover:bg-muted'\n )}\n >\n {s}\n </button>\n ))}\n </div>,\n document.body\n )}\n </div>\n );\n }\n);\n\nTagEditor.displayName = 'TagEditor';\n"]}