@icij/murmur-next 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/.github/workflows/deploy-github-pages.yaml +50 -0
  2. package/.storybook/app.scss +14 -0
  3. package/.storybook/doc_variables.scss +20 -0
  4. package/.storybook/main.ts +35 -0
  5. package/.storybook/preview-head.html +2 -0
  6. package/.storybook/preview.ts +32 -0
  7. package/README.md +71 -0
  8. package/deploy.js +15 -0
  9. package/docs/components/ApiTable.vue +171 -0
  10. package/docs/components/App.vue +146 -0
  11. package/docs/components/CollapsibleBlock.vue +122 -0
  12. package/docs/components/DocsHeader.vue +68 -0
  13. package/docs/components/DocsMenu.vue +201 -0
  14. package/docs/components/DocsMenuSection.vue +109 -0
  15. package/docs/components/EditLink.vue +49 -0
  16. package/docs/components/OutboundLink.vue +13 -0
  17. package/docs/components/PalettePresenter.vue +96 -0
  18. package/docs/components/RepositoryLink.vue +28 -0
  19. package/docs/components/SampleCard.vue +119 -0
  20. package/docs/main.js +42 -0
  21. package/docs/pages/components/accordion/doc.md +96 -0
  22. package/docs/pages/components/active-text-truncate/doc.md +44 -0
  23. package/docs/pages/components/advanced-link-form/doc.md +105 -0
  24. package/docs/pages/components/brand/doc.md +30 -0
  25. package/docs/pages/components/brand-expansion/doc.md +70 -0
  26. package/docs/pages/components/confirm-button/doc.md +91 -0
  27. package/docs/pages/components/content-placeholder/doc.md +16 -0
  28. package/docs/pages/components/custom-pagination/doc.md +61 -0
  29. package/docs/pages/components/digits-input/doc.md +28 -0
  30. package/docs/pages/components/donate-form/doc.md +20 -0
  31. package/docs/pages/components/embed-form/doc.md +22 -0
  32. package/docs/pages/components/embeddable-footer/doc.md +60 -0
  33. package/docs/pages/components/follow-us-popover/doc.md +5 -0
  34. package/docs/pages/components/generic-footer/doc.md +21 -0
  35. package/docs/pages/components/generic-header/doc.md +24 -0
  36. package/docs/pages/components/haptic-copy/doc.md +27 -0
  37. package/docs/pages/components/imddb-header/doc.md +23 -0
  38. package/docs/pages/components/ordinal-legend/doc.md +44 -0
  39. package/docs/pages/components/range-picker/doc.md +86 -0
  40. package/docs/pages/components/responsive-iframe/doc.md +13 -0
  41. package/docs/pages/components/scale-legend/doc.md +65 -0
  42. package/docs/pages/components/secret-input/doc.md +12 -0
  43. package/docs/pages/components/selectable-dropdown/doc.md +156 -0
  44. package/docs/pages/components/sharing-options/doc.md +13 -0
  45. package/docs/pages/components/sharing-options-link/doc.md +36 -0
  46. package/docs/pages/components/sign-up-form/doc.md +13 -0
  47. package/docs/pages/components/slide-up-down/doc.md +28 -0
  48. package/docs/pages/components/textured-deck/doc.md +78 -0
  49. package/docs/pages/components/tiny-pagination/doc.md +92 -0
  50. package/docs/pages/datavisualisation/bars/doc.md +110 -0
  51. package/docs/pages/datavisualisation/columns/doc.md +165 -0
  52. package/docs/pages/datavisualisation/lines/doc.md +139 -0
  53. package/docs/pages/datavisualisation/stacked-bar/doc.md +160 -0
  54. package/docs/pages/datavisualisation/stacked-column/doc.md +191 -0
  55. package/docs/pages/getting-started/about-icij/doc.md +13 -0
  56. package/docs/pages/getting-started/custom-bootstrap/doc.md +36 -0
  57. package/docs/pages/getting-started/installation-guide/doc.md +59 -0
  58. package/docs/pages/getting-started/internationalization/doc.md +74 -0
  59. package/docs/pages/maps/choropleth-map/doc.md +420 -0
  60. package/docs/pages/maps/choropleth-map-annotation/doc.md +373 -0
  61. package/docs/pages/maps/symbol-map/doc.md +203 -0
  62. package/docs/pages/structure/breakpoints/doc.md +3 -0
  63. package/docs/pages/structure/grid/doc.md +3 -0
  64. package/docs/pages/utilities/assets/doc.md +138 -0
  65. package/docs/pages/utilities/config/doc.md +52 -0
  66. package/docs/pages/utilities/iframes/doc.md +3 -0
  67. package/docs/pages/visual/colors/doc.md +31 -0
  68. package/docs/pages/visual/iconography/doc.md +56 -0
  69. package/docs/pages/visual/states/doc.md +77 -0
  70. package/docs/pages/visual/themes/doc.md +3 -0
  71. package/docs/pages/visual/typography/doc.md +71 -0
  72. package/docs/routes.js +25 -0
  73. package/docs/store/index.js +21 -0
  74. package/docs/styles/app.scss +36 -0
  75. package/docs/styles/variables.scss +20 -0
  76. package/lib/assets/images/icij-full-white.svg +6 -0
  77. package/lib/assets/images/icij-full.svg +6 -0
  78. package/lib/assets/images/icij.png +0 -0
  79. package/lib/assets/images/icij.svg +46 -0
  80. package/lib/assets/images/icij@2x.png +0 -0
  81. package/lib/assets/images/murmur-dark.png +0 -0
  82. package/lib/assets/images/murmur-dark.svg +79 -0
  83. package/lib/assets/images/murmur-white.png +0 -0
  84. package/lib/assets/images/murmur-white.svg +68 -0
  85. package/lib/components/AccordionStep.vue +128 -0
  86. package/lib/components/AccordionWrapper.vue +138 -0
  87. package/lib/components/ActiveTextTruncate.vue +258 -0
  88. package/lib/components/AdvancedLinkForm.vue +273 -0
  89. package/lib/components/Brand.vue +150 -0
  90. package/lib/components/BrandExpansion.vue +237 -0
  91. package/lib/components/ConfirmButton.vue +204 -0
  92. package/lib/components/ContentPlaceholder.vue +100 -0
  93. package/lib/components/CustomPagination.vue +225 -0
  94. package/lib/components/DigitsInput.vue +180 -0
  95. package/lib/components/DonateForm.vue +367 -0
  96. package/lib/components/EmbedForm.vue +173 -0
  97. package/lib/components/EmbeddableFooter.vue +201 -0
  98. package/lib/components/Fa.js +3 -0
  99. package/lib/components/FollowUsPopover.vue +117 -0
  100. package/lib/components/GenericFooter.vue +218 -0
  101. package/lib/components/GenericHeader.vue +259 -0
  102. package/lib/components/HapticCopy.vue +256 -0
  103. package/lib/components/ImddbHeader.vue +336 -0
  104. package/lib/components/OrdinalLegend.vue +164 -0
  105. package/lib/components/RangePicker.vue +430 -0
  106. package/lib/components/ResponsiveIframe.vue +48 -0
  107. package/lib/components/ScaleLegend.vue +230 -0
  108. package/lib/components/SecretInput.vue +132 -0
  109. package/lib/components/SelectableDropdown.vue +368 -0
  110. package/lib/components/SharingOptions.vue +230 -0
  111. package/lib/components/SharingOptionsLink.vue +259 -0
  112. package/lib/components/SignUpForm.vue +181 -0
  113. package/lib/components/SlideUpDown.vue +131 -0
  114. package/lib/components/TexturedDeck.vue +101 -0
  115. package/lib/components/TinyPagination.vue +268 -0
  116. package/lib/components/index.js +31 -0
  117. package/lib/composables/chart.ts +182 -0
  118. package/lib/composables/resizeObserver.ts +37 -0
  119. package/lib/composables/sendEmail.ts +50 -0
  120. package/lib/config.default.ts +33 -0
  121. package/lib/config.ts +70 -0
  122. package/lib/d3-geo-projection.d.ts +1 -0
  123. package/lib/datavisualisations/BarChart.vue +275 -0
  124. package/lib/datavisualisations/ColumnChart.vue +527 -0
  125. package/lib/datavisualisations/LineChart.vue +274 -0
  126. package/lib/datavisualisations/StackedBarChart.vue +614 -0
  127. package/lib/datavisualisations/StackedColumnChart.vue +640 -0
  128. package/lib/datavisualisations/index.js +5 -0
  129. package/lib/enums.ts +25 -0
  130. package/lib/i18n.ts +16 -0
  131. package/lib/keys.ts +2 -0
  132. package/lib/locales/en.json +140 -0
  133. package/lib/locales/fr.json +117 -0
  134. package/lib/locales/locales/en.json +140 -0
  135. package/lib/locales/locales/fr.json +117 -0
  136. package/lib/main.ts +87 -0
  137. package/lib/maps/ChoroplethMap.vue +825 -0
  138. package/lib/maps/ChoroplethMapAnnotation.vue +336 -0
  139. package/lib/maps/SymbolMap.vue +628 -0
  140. package/lib/maps/index.js +3 -0
  141. package/lib/querystring-es3.d.ts +1 -0
  142. package/lib/shims-bootstrap-vue.d.ts +5 -0
  143. package/lib/shims-tsx.d.ts +11 -0
  144. package/lib/shims-vue.d.ts +14 -0
  145. package/lib/styles/functions.scss +20 -0
  146. package/lib/styles/lib.scss +19 -0
  147. package/lib/styles/mixins.scss +37 -0
  148. package/lib/styles/utilities.scss +18 -0
  149. package/lib/styles/variables.scss +94 -0
  150. package/lib/styles/variables_dark.scss +1 -0
  151. package/lib/types.ts +46 -0
  152. package/lib/utils/animation.ts +24 -0
  153. package/lib/utils/assets.ts +46 -0
  154. package/lib/utils/clipboard.ts +41 -0
  155. package/lib/utils/iframe-resizer.ts +49 -0
  156. package/lib/utils/placeholder.ts +66 -0
  157. package/lib/utils/placeholderTypes.ts +21 -0
  158. package/lib/utils/strings.ts +8 -0
  159. package/loaders/highlight-loader.js +13 -0
  160. package/loaders/markdown-loader.js +91 -0
  161. package/loaders/metadata-loader.js +18 -0
  162. package/loaders/sass-extract-loader.js +14 -0
  163. package/loaders/vue-docgen-loader.js +14 -0
  164. package/package.json +96 -0
  165. package/plugins/MdPluginTypes.ts +10 -0
  166. package/plugins/docs.ts +50 -0
  167. package/plugins/front-matter.ts +36 -0
  168. package/plugins/highlight.ts +27 -0
  169. package/plugins/markdown-it/api-table.ts +25 -0
  170. package/plugins/markdown-it/sample-card.ts +31 -0
  171. package/plugins/plugin-delete.ts +47 -0
  172. package/plugins/plugin-docgen.ts +23 -0
  173. package/plugins/sass-vars.ts +25 -0
  174. package/plugins/vue-docgen.ts +29 -0
  175. package/public/android-chrome-192x192.png +0 -0
  176. package/public/android-chrome-512x512.png +0 -0
  177. package/public/apple-touch-icon.png +0 -0
  178. package/public/assets/img/arrow-bottom.svg +3 -0
  179. package/public/assets/img/texture-brick-black.jpg +0 -0
  180. package/public/assets/img/texture-brick.jpg +0 -0
  181. package/public/assets/img/texture-carbon-black.jpg +0 -0
  182. package/public/assets/img/texture-carbon.jpg +0 -0
  183. package/public/assets/img/texture-crack-black.jpg +0 -0
  184. package/public/assets/img/texture-crack.jpg +0 -0
  185. package/public/assets/img/texture-rock-black.jpg +0 -0
  186. package/public/assets/img/texture-rock.jpg +0 -0
  187. package/public/assets/img/texture-sand-black.jpg +0 -0
  188. package/public/assets/img/texture-sand.jpg +0 -0
  189. package/public/assets/img/texture-silk-black.jpg +0 -0
  190. package/public/assets/img/texture-silk.jpg +0 -0
  191. package/public/assets/topojson/france-departments.json +1 -0
  192. package/public/assets/topojson/paris-arrondissements.json +1 -0
  193. package/public/assets/topojson/world-countries-sans-antarctica.json +1 -0
  194. package/public/favicon-16x16.png +0 -0
  195. package/public/favicon-32x32.png +0 -0
  196. package/public/favicon.ico +0 -0
  197. package/public/site.webmanifest +1 -0
  198. package/stories/assets/code-brackets.svg +1 -0
  199. package/stories/assets/colors.svg +1 -0
  200. package/stories/assets/comments.svg +1 -0
  201. package/stories/assets/direction.svg +1 -0
  202. package/stories/assets/flow.svg +1 -0
  203. package/stories/assets/plugin.svg +1 -0
  204. package/stories/assets/repo.svg +1 -0
  205. package/stories/assets/stackalt.svg +1 -0
  206. package/stories/getting-started/about-icij.mdx +14 -0
  207. package/stories/getting-started/custom-bootstrap.mdx +23 -0
  208. package/stories/getting-started/installation-guide.mdx +62 -0
  209. package/stories/getting-started/internationalization.mdx +63 -0
  210. package/stories/murmur/components/AccordionStep.stories.ts +33 -0
  211. package/stories/murmur/components/AccordionWrapper.stories.ts +69 -0
  212. package/stories/murmur/components/ActiveTextTruncate.stories.ts +32 -0
  213. package/stories/murmur/components/AdvancedLinkForm.stories.ts +77 -0
  214. package/stories/murmur/components/Brand.stories.ts +30 -0
  215. package/stories/murmur/components/BrandExpansion.stories.ts +41 -0
  216. package/stories/murmur/components/ConfirmButton.stories.ts +40 -0
  217. package/stories/murmur/components/ContentPlaceholder.stories.ts +41 -0
  218. package/stories/murmur/components/CustomPagination.stories.ts +42 -0
  219. package/stories/murmur/components/DigitsInput.stories.ts +29 -0
  220. package/stories/murmur/components/DonateForm.stories.ts +29 -0
  221. package/stories/murmur/components/EmbedForm.stories.ts +35 -0
  222. package/stories/murmur/components/EmbeddableFooter.stories.ts +59 -0
  223. package/stories/murmur/components/FollowUsPopover.stories.ts +24 -0
  224. package/stories/murmur/components/GenericFooter.stories.ts +27 -0
  225. package/stories/murmur/components/GenericHeader.stories.ts +27 -0
  226. package/stories/murmur/components/HapticCopy.stories.ts +40 -0
  227. package/stories/murmur/components/ImddbHeader.stories.ts +27 -0
  228. package/stories/murmur/components/OrdinalLegend.stories.ts +49 -0
  229. package/stories/murmur/components/RangePicker.stories.ts +98 -0
  230. package/stories/murmur/components/ResponsiveIframe.stories.ts +24 -0
  231. package/stories/murmur/components/ScaleLegend.stories.ts +65 -0
  232. package/stories/murmur/components/SecretInput.stories.ts +60 -0
  233. package/stories/murmur/components/SelectableDropdown.stories.ts +143 -0
  234. package/stories/murmur/components/SharingOptions.stories.ts +32 -0
  235. package/stories/murmur/components/SharingOptionsLink.stories.ts +53 -0
  236. package/stories/murmur/components/SignUpForm.stories.ts +51 -0
  237. package/stories/murmur/components/SlideUpDown.stories.ts +32 -0
  238. package/stories/murmur/components/TexturedDeck.stories.ts +83 -0
  239. package/stories/murmur/components/TinyPagination.stories.ts +65 -0
  240. package/stories/murmur/datavisualisations/BarChart.stories.ts +54 -0
  241. package/stories/murmur/datavisualisations/ColumnChart.stories.ts +88 -0
  242. package/stories/murmur/datavisualisations/LineChart.stories.ts +139 -0
  243. package/stories/murmur/datavisualisations/StackedBarChart.stories.ts +199 -0
  244. package/stories/murmur/datavisualisations/StackedColumnChart.stories.ts +136 -0
  245. package/stories/murmur/decorators.ts +108 -0
  246. package/stories/murmur/maps/ChoroplethMap.stories.ts +440 -0
  247. package/stories/murmur/maps/ChoroplethMapAnnotation.stories.ts +26 -0
  248. package/stories/murmur/maps/SymbolMap.stories.ts +24 -0
  249. package/stories/murmur/utils.ts +7 -0
  250. package/tests/unit/components/AccordionStep.spec.ts +157 -0
  251. package/tests/unit/components/AccordionWrapper.spec.ts +57 -0
  252. package/tests/unit/components/ActiveTextTruncate.spec.js +30 -0
  253. package/tests/unit/components/AdvancedLinkForm.spec.js +124 -0
  254. package/tests/unit/components/Brand.spec.js +50 -0
  255. package/tests/unit/components/ContentPlaceholder.spec.js +29 -0
  256. package/tests/unit/components/CustomPagination.spec.js +72 -0
  257. package/tests/unit/components/DigitsInput.spec.ts +157 -0
  258. package/tests/unit/components/DonateForm.spec.js +149 -0
  259. package/tests/unit/components/EmbedForm.spec.js +108 -0
  260. package/tests/unit/components/EmbeddableFooter.spec.js +11 -0
  261. package/tests/unit/components/Fa.spec.js +18 -0
  262. package/tests/unit/components/FollowUsPopover.spec.js +29 -0
  263. package/tests/unit/components/GenericFooter.spec.js +29 -0
  264. package/tests/unit/components/GenericHeader.spec.js +104 -0
  265. package/tests/unit/components/HapticCopy.spec.js +123 -0
  266. package/tests/unit/components/ImddbHeader.spec.js +96 -0
  267. package/tests/unit/components/OrdinalLegend.spec.js +120 -0
  268. package/tests/unit/components/RangePicker.spec.ts +87 -0
  269. package/tests/unit/components/ResponsiveIframe.spec.js +20 -0
  270. package/tests/unit/components/ScaleLegend.spec.js +139 -0
  271. package/tests/unit/components/SecretInput.spec.js +81 -0
  272. package/tests/unit/components/SelectableDropdown.spec.js +160 -0
  273. package/tests/unit/components/SharingOptions.spec.js +125 -0
  274. package/tests/unit/components/SharingOptionsLink.spec.js +184 -0
  275. package/tests/unit/components/SignUpForm.spec.js +145 -0
  276. package/tests/unit/components/SlideUpDown.spec.js +59 -0
  277. package/tests/unit/components/TinyPagination.spec.js +46 -0
  278. package/tests/unit/config.spec.js +136 -0
  279. package/tests/unit/datavisualisations/BarChart.spec.js +63 -0
  280. package/tests/unit/datavisualisations/ColumnChart.spec.js +344 -0
  281. package/tests/unit/datavisualisations/LineChart.spec.js +155 -0
  282. package/tests/unit/datavisualisations/StackedBarChart.spec.js +294 -0
  283. package/tests/unit/datavisualisations/StackedColumnChart.spec.js +443 -0
  284. package/tests/unit/i18n.spec.ts +19 -0
  285. package/tests/unit/main.spec.js +82 -0
  286. package/tests/unit/maps/ChoroplethMap.spec.js +214 -0
  287. package/tests/unit/maps/ChoroplethMapAnnotation.spec.ts +186 -0
  288. package/tests/unit/maps/SymbolMap.spec.js +92 -0
  289. package/tests/unit/require.spec.js +22 -0
  290. package/tests/unit/setup.js +13 -0
  291. package/tests/unit/utils/assets.spec.js +61 -0
  292. package/tests/unit/utils/clipboard.spec.js +18 -0
  293. package/tests/unit/utils/iframe-resizer.spec.js +71 -0
  294. package/tsconfig.json +35 -0
  295. package/vite.config.ts +79 -0
  296. package/vitest.config.ts +19 -0
@@ -0,0 +1,37 @@
1
+ @mixin keyframes($animationName) {
2
+ @-webkit-keyframes #{$animationName} {
3
+ @content;
4
+ }
5
+ @-moz-keyframes #{$animationName} {
6
+ @content;
7
+ }
8
+ @-o-keyframes #{$animationName} {
9
+ @content;
10
+ }
11
+ @keyframes #{$animationName} {
12
+ @content;
13
+ }
14
+ }
15
+
16
+ @mixin animation($animation) {
17
+ -webkit-animation:$animation;
18
+ -moz-animation:$animation;
19
+ -o-animation:$animation;
20
+ animation:$animation;
21
+ }
22
+
23
+ @mixin animation-delay-loop($from:0, $to:10, $delay: 300ms) {
24
+ @for $i from $from through $to {
25
+ &:nth-child(#{$i}) {
26
+ animation-delay: $i * $delay;
27
+ }
28
+ }
29
+ }
30
+
31
+ @mixin vendor-prefix($name, $argument) {
32
+ -webkit-#{$name}: #{$argument};
33
+ -ms-#{$name}: #{$argument};
34
+ -moz-#{$name}: #{$argument};
35
+ -o-#{$name}: #{$argument};
36
+ #{$name}: #{$argument};
37
+ }
@@ -0,0 +1,18 @@
1
+ .text-jumbotron {
2
+ font-family: $jumbotron-font-family;
3
+ font-weight: $jumbotron-font-weight;
4
+ }
5
+
6
+ .text-sans-serif {
7
+ font-family: $font-family-sans-serif;
8
+ }
9
+
10
+ .text-serif {
11
+ font-family: $font-family-serif;
12
+ }
13
+
14
+ .jumbotron > h1,
15
+ .jumbotron > .h1 {
16
+ font-family: $jumbotron-font-family;
17
+ font-weight: $jumbotron-font-weight;
18
+ }
@@ -0,0 +1,94 @@
1
+ $white: #fff !default;
2
+ $gray-100: #f8f8f8 !default;
3
+ $gray-200: #e9e9e9 !default;
4
+ $gray-300: #dedede !default;
5
+ $gray-400: #cccccc !default; // Brand color
6
+ $gray-500: #999999 !default; // Brand color
7
+ $gray-600: #696969 !default; // Brand color
8
+ $gray-700: #494949 !default;
9
+ $gray-800: #3c3c3c !default; // Brand color
10
+ $gray-900: #212121 !default;
11
+ $black: #000 !default;
12
+
13
+ $primary: #ff0000 !default; // Brand color
14
+ $secondary: $gray-500 !default;
15
+ $danger: #8B0707 !default; // Brand color
16
+ $success: #46EC4E !default;
17
+ $info: #0000FF !default;
18
+ $warning: #FFBA00 !default;
19
+ $light: $gray-200 !default;
20
+ $dark: #000 !default;
21
+
22
+ $brand-grays: () !default;
23
+ $brand-grays: map-merge(
24
+ (
25
+ "gray-lighter": $gray-400,
26
+ "gray-light": $gray-500,
27
+ "gray-dark": $gray-600,
28
+ "gray-darker": $gray-800
29
+ ),
30
+ $brand-grays
31
+ );
32
+
33
+ $body-bg: $white !default; // Brand color
34
+ $body-color: $black !default; // Brand color
35
+ $text-muted: $gray-500 !default;
36
+
37
+ $component-active-bg: $primary !default;
38
+ $component-active-color: $white;
39
+
40
+ $table-dark-bg: $gray-800 !default;
41
+ $table-dark-border-color: $gray-600 !default;
42
+
43
+ $enable-rounded: false !default;
44
+ $enable-shadows: true !default;
45
+ $enable-gradients: false !default;
46
+
47
+ $font-family-sans-serif: "Poppins", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default;
48
+ $font-family-serif: "Merriweather", Georgia, "Times New Roman", Times, serif !default;
49
+
50
+ $headings-font-family: $font-family-sans-serif !default;
51
+ $headings-font-weight: 700 !default;
52
+
53
+ $jumbotron-bg: $gray-200 !default;
54
+ $jumbotron-font-family: "Anton", $font-family-sans-serif !default;
55
+ $jumbotron-font-weight: 400 !default;
56
+
57
+ $fade-bg: $gray-400 !default;
58
+ $list-group-bg: transparent !default;
59
+
60
+ $input-focus-border-color: $secondary !default;
61
+ $bs-input-bg: $gray-100 !default;
62
+ $input-focus-bg: $white !default;
63
+ $input-box-shadow: none !default;
64
+
65
+ $btn-box-shadow: none !default;
66
+ $btn-font-family: $font-family-sans-serif;
67
+
68
+ $form-check-input-gutter: 1.5rem !default;
69
+
70
+ $popover-body-padding-y: 0 !default;
71
+ $popover-body-padding-x: 0 !default;
72
+ $popover-max-width: 300px !default;
73
+
74
+ $popover-box-shadow: 0 10px 30px -5px rgba($black, 0.15) !default;
75
+ $dropdown-box-shadow: $popover-box-shadow !default;
76
+ $dropdown-min-width: 14rem;
77
+
78
+ $modal-backdrop-bg: $white !default;
79
+ $modal-lg: 990px !default;
80
+ $modal-content-box-shadow-xs: $popover-box-shadow !default;
81
+ $modal-content-box-shadow-sm-up: $popover-box-shadow !default;
82
+
83
+ $tooltip-max-width: 260px !default;
84
+ $tooltip-opacity: 1 !default;
85
+
86
+ $alert-border-width: 0;
87
+
88
+ // Bootstrap variables and functions must be available everywhere
89
+ @import 'node_modules/bootstrap/scss/_functions.scss';
90
+ @import 'node_modules/bootstrap/scss/_variables.scss';
91
+
92
+ // Get theses variables to make them available in the doc
93
+ $theme-colors: none !default;
94
+ $font-family-monospace: none !default;
@@ -0,0 +1 @@
1
+ $bs-input-bg-dark: $gray-900 !default;
package/lib/types.ts ADDED
@@ -0,0 +1,46 @@
1
+ import type { StyleValue } from 'vue'
2
+
3
+ import {AccordionKey, ParentKey} from '@/keys'
4
+ import { ComputedRef } from 'vue'
5
+ import type { GeoProjection } from 'd3-geo'
6
+ import { Ref } from 'vue'
7
+
8
+
9
+ export type Step = symbol | string
10
+
11
+ export type Accordion = {
12
+ emitAccordionNextStepEvent: () => void
13
+ emitAccordionPreviousStepEvent: () => void
14
+ isActiveStep: (step: Step) => boolean
15
+ isPreviousStep: (step: Step) => boolean
16
+ isFirstStep: (step: Step) => boolean
17
+ isLastStep: (step: Step) => boolean
18
+ step: Step
19
+ steps: Step[]
20
+ }
21
+
22
+ export type AccordionProvide = {
23
+ [AccordionKey]: Accordion
24
+ }
25
+
26
+ export type BrandStyle = StyleValue & {
27
+ '--monochrome-color': string
28
+ color: string
29
+ background: string
30
+ width: string
31
+ }
32
+
33
+ export type BrandExpansionStyle = Pick<BrandStyle, '--monochrome-color' | 'background'>
34
+
35
+ export type Variant = 'primary' | 'secondary' | 'danger' | 'info' | 'warning' | 'success' | 'dark' | 'light'
36
+
37
+ export type MapTransform = { k: number, x: number, y: number, rotateX: number, rotateY : number }
38
+
39
+ export type ParentMap = {
40
+ mapRect:Ref<DOMRect>,
41
+ mapTransform:Ref<MapTransform>,
42
+ rotatingMapProjection:ComputedRef<GeoProjection|Function>
43
+ }
44
+ export type ParentMapProvide = {
45
+ [ParentKey]: ParentMap
46
+ }
@@ -0,0 +1,24 @@
1
+ export class RequestAnimationFrameWrapper {
2
+ live: boolean
3
+ callback: () => void
4
+
5
+ constructor () {
6
+ this.live = false
7
+ this.callback = () => null
8
+ }
9
+ start (callback: () => void) {
10
+ this.live = true
11
+ this.callback = callback
12
+ this.schedule()
13
+ }
14
+ stop () {
15
+ this.live = false
16
+ this.callback = () => null
17
+ }
18
+ schedule () {
19
+ this.callback()
20
+ if (this.live) {
21
+ window.requestAnimationFrame(this.schedule.bind(this))
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,46 @@
1
+ import { memoize, flatten } from 'lodash'
2
+
3
+ var assetUniqueIdCounter: number = 0;
4
+
5
+ export const injectAsset = memoize(function(file: string, id: string = `dynamic-asset-${assetUniqueIdCounter++}`): Promise<unknown> {
6
+
7
+ return new Promise((resolve: (value?: unknown) => void) => {
8
+ const parent: HTMLElement = document.querySelector("body") || document.querySelector("head")!
9
+ const parts = file.split(".");
10
+ const ext = parts[parts.length-1].toLowerCase();
11
+ switch(ext) {
12
+ case "js":
13
+ var script = document.createElement('script');
14
+ script.setAttribute("type", "text/javascript");
15
+ script.onload = resolve
16
+ parent.appendChild(script);
17
+ script.setAttribute("src", file);
18
+ script.setAttribute("id", id);
19
+ break;
20
+ case "css":
21
+ var css = document.createElement('link');
22
+ css.setAttribute("rel", "stylesheet");
23
+ css.setAttribute("type", "text/css");
24
+ css.onload = resolve
25
+ parent.appendChild(css);
26
+ css.setAttribute("href", file);
27
+ css.setAttribute("id", id);
28
+ break;
29
+ }
30
+ })
31
+ })
32
+
33
+ export const injectAssets = function(...args: string[]): Promise<void> {
34
+ const files = flatten(args)
35
+ return new Promise((resolve: () => void) => {
36
+ var filesLoaded = 0;
37
+ var allFilesLoaded = function() {
38
+ if(++filesLoaded == files.length) {
39
+ resolve();
40
+ }
41
+ }
42
+ for(var i=0; i < files.length ; i++) {
43
+ injectAsset(files[i]).then(allFilesLoaded)
44
+ }
45
+ })
46
+ }
@@ -0,0 +1,41 @@
1
+ import Clipboard from 'clipboard'
2
+
3
+ export function copyText (text: string, container: Element): Promise<void> {
4
+ return new Promise(function (resolve: (value?:undefined) => void, reject: (value?: Clipboard.Event) => void) {
5
+ const fakeElement = document.createElement('button')
6
+ // Use the document body as container is no valid object is provided
7
+ container = typeof container === 'object' ? container : document.body
8
+
9
+ const clipboard: Clipboard = new Clipboard(fakeElement, { text: () => text, container })
10
+
11
+ clipboard.on('success', () => {
12
+ clipboard.destroy()
13
+ resolve()
14
+ })
15
+
16
+ clipboard.on('error', error => {
17
+ clipboard.destroy()
18
+ reject(error)
19
+ })
20
+
21
+ fakeElement.click()
22
+ })
23
+ }
24
+
25
+ export function copyHtml (html: string, plain: string) {
26
+ interface ClipboardEvent extends Event {
27
+ clipboardData: {
28
+ setData: (attribute: string, value: string) => void
29
+ }
30
+ }
31
+
32
+ function listener(event: ClipboardEvent) {
33
+ event.clipboardData.setData("text/html", html)
34
+ event.clipboardData.setData("text/plain", plain)
35
+ event.preventDefault()
36
+ }
37
+
38
+ document.addEventListener("copy", listener as EventListener)
39
+ document.execCommand("copy")
40
+ document.removeEventListener("copy", listener as EventListener)
41
+ }
@@ -0,0 +1,49 @@
1
+ import every from 'lodash/every'
2
+ import { Child as PymChild } from 'pym.js'
3
+ import { injectAssets } from './assets'
4
+
5
+ // Will hold the pym instance once
6
+ var pymChild: PymChild
7
+ // URL parameters generated by Pym
8
+ const pymParams = ['initialWidth', 'childId', 'parentUrl', 'parentTitle']
9
+ // Save the initial window href value in case it changes
10
+ const initialHref = window.location.href
11
+
12
+ export default class IframeResizer {
13
+ initializer: Promise<PymChild>
14
+
15
+ constructor () {
16
+ this.initializer = injectAssets('//pym.nprapps.org/pym.v1.min.js').then(() => {
17
+ pymChild = pymChild || new window.pym.Child({ polling: 300 })
18
+ return pymChild
19
+ })
20
+ }
21
+ sendHeight (): Promise<void> {
22
+ return this.initializer.then(pymChild => pymChild.sendHeight())
23
+ }
24
+ static create (): IframeResizer {
25
+ return new IframeResizer()
26
+ }
27
+ static template(url: string, id: string = 'icij-' + Date.now().toString(32)): string {
28
+ return [
29
+ `<script type="text/javascript" src="https://pym.nprapps.org/pym.v1.min.js"></script>`,
30
+ `<div id="${id}"></div>`,
31
+ `<script>`,
32
+ `const icijIframe = new pym.Parent("${id}", "${IframeResizer.deletePymParams(url)}", {})`,
33
+ `</script>`,
34
+ ].join('\n')
35
+ }
36
+ static deletePymParams(href: string = initialHref): string {
37
+ const url = new URL(href);
38
+ // Remove all unwanted param
39
+ for (const param of pymParams) {
40
+ url.searchParams.delete(param)
41
+ }
42
+ // Rebuild the URL
43
+ return url.href
44
+ }
45
+ static isEmbedded (href: string = initialHref): boolean {
46
+ const url = new URL(href)
47
+ return every(pymParams, param => url.searchParams.has(param))
48
+ }
49
+ }
@@ -0,0 +1,66 @@
1
+ import { BoxStyle, ContentPlaceholderStyledRow, ContentPlaceholderRow, ContentPlaceholderRowBoxes, ContentPlaceholderStyledRows, ContentPlaceholderRows } from "@/utils/placeholderTypes"
2
+
3
+ export function isFlexBasis(value: string | number): boolean {
4
+ return Number(value).toString() === value.toString()
5
+ }
6
+
7
+ export function isWidth(value: string | number): boolean {
8
+ const valueAsStr = String(value)
9
+ const cssSuffix = ['px', '%', 'em', 'rem']
10
+ let checkState = false
11
+ cssSuffix.forEach(suffix => {
12
+ if (Number(valueAsStr.split(suffix)[0]) &&
13
+ valueAsStr.split(suffix)[1] === '' &&
14
+ valueAsStr.split(suffix).length === 2) {
15
+ checkState = true
16
+ }
17
+ })
18
+ return checkState
19
+ }
20
+
21
+ export function getBoxStyle(left: number, width: number, isLast: boolean, subClass: string = 'box'): BoxStyle[] {
22
+ const arr: BoxStyle[] = []
23
+
24
+ if (left !== 0) {
25
+ if (isFlexBasis(left)) {
26
+ arr.push({ style: `flex-grow: ${left}; flex-shrink: 0; flex-basis: 0;`, subClass })
27
+ } else if (isWidth(left)) {
28
+ arr.push({ style: `flex-grow: 0; flex-shrink: 0; flex-basis: ${left};`, subClass })
29
+ }
30
+ }
31
+ if (isFlexBasis(width)) {
32
+ arr.push({ style: `flex-grow: ${width}; flex-shrink: 0; flex-basis: 0;` })
33
+ } else if (isWidth(width)) {
34
+ arr.push({ style: `flex-grow: 0; flex-shrink: 0; flex-basis: ${width};` })
35
+ }
36
+ if (isLast) {
37
+ arr.push({ style: 'flex-grow: 1; flex-shrink: 0; flex-basis: 0;', subClass })
38
+ }
39
+ return arr
40
+ }
41
+
42
+ export function formatRows(rows: ContentPlaceholderRows, subClass: string = 'box'): ContentPlaceholderStyledRows {
43
+ const rowArr: ContentPlaceholderStyledRows = rows.map((row: ContentPlaceholderRow) => {
44
+ // Will contain all boxes in
45
+ const rowBoxes: Array<BoxStyle> = []
46
+ // Create placeholder row with initial height
47
+ const rowObj: ContentPlaceholderStyledRow = { height: row.height, boxes: [] }
48
+ // Add style
49
+ row.boxes.forEach((box: Array<any>, index: number) => {
50
+ const isLast: boolean = index === row.boxes.length - 1
51
+ // Merge the box styles
52
+ rowBoxes.push(...getBoxStyle(box[0], box[1], isLast, subClass))
53
+ })
54
+ rowObj.boxes = rowBoxes
55
+ return rowObj
56
+ })
57
+
58
+ return rowArr
59
+ }
60
+
61
+ export default {
62
+ isFlexBasis,
63
+ isWidth,
64
+ getBoxStyle,
65
+ formatRows
66
+ }
@@ -0,0 +1,21 @@
1
+ import type { StyleValue } from 'vue'
2
+
3
+ export interface BoxStyle {
4
+ style: StyleValue,
5
+ subClass?: string
6
+ }
7
+
8
+ export type ContentPlaceholderRowBoxes = Array<Array<number | string>>
9
+
10
+ export interface ContentPlaceholderRow {
11
+ height: number | string,
12
+ boxes: ContentPlaceholderRowBoxes
13
+ }
14
+
15
+ export interface ContentPlaceholderStyledRow {
16
+ height: number | string,
17
+ boxes: Array<BoxStyle>
18
+ }
19
+
20
+ export type ContentPlaceholderStyledRows = Array<ContentPlaceholderStyledRow>
21
+ export type ContentPlaceholderRows = Array<ContentPlaceholderRow>
@@ -0,0 +1,8 @@
1
+ export function isUrl(value: string): boolean {
2
+ try {
3
+ new URL(value)
4
+ } catch (_) {
5
+ return false
6
+ }
7
+ return true
8
+ }
@@ -0,0 +1,13 @@
1
+ const hljs = require('highlight.js')
2
+ const loaderUtils = require('loader-utils')
3
+
4
+ module.exports = function highlightLoader(source) {
5
+ this && this.cacheable && this.cacheable()
6
+ const query = loaderUtils.parseQuery(this.query || '?')
7
+ const language = query.lang
8
+ const code = hljs.getLanguage(language) ? hljs.highlight(source, { language }) : hljs.highlightAuto(source)
9
+ const json = JSON.stringify(code.value)
10
+ .replace(/\u2028/g, '\\u2028')
11
+ .replace(/\u2029/g, '\\u2029');
12
+ return `module.exports = ${json}`;
13
+ }
@@ -0,0 +1,91 @@
1
+ 'use strict'
2
+
3
+ /**
4
+ * @src https://github.com/vuejs/vuepress/tree/master/packages/%40vuepress/markdown-loader
5
+ * Module dependencies.
6
+ */
7
+
8
+ const { EventEmitter } = require('events')
9
+ const { getOptions } = require('loader-utils')
10
+ const { fs, path, hash, parseFrontmatter, } = require('@vuepress/shared-utils')
11
+ const LRU = require('lru-cache')
12
+ const md = require('@vuepress/markdown')
13
+
14
+ const cache = LRU({ max: 1000 })
15
+
16
+ /**
17
+ * Expose markdown loader.
18
+ */
19
+
20
+ module.exports = function (src) {
21
+ const isProd = process.env.NODE_ENV === 'production'
22
+ const options = getOptions(this)
23
+ const { sourceDir } = options
24
+ let { markdown } = options
25
+ // Duck-typing to ensure we received a correct markdown-it instance
26
+ if (!markdown || !markdown.parse) {
27
+ markdown = md()
28
+ }
29
+
30
+ // we implement a manual cache here because this loader is chained before
31
+ // vue-loader, and will be applied on the same file multiple times when
32
+ // selecting the individual blocks.
33
+ const file = this.resourcePath
34
+ const key = hash(file + src)
35
+ const cached = cache.get(key)
36
+ if (cached && (isProd || /\?vue/.test(this.resourceQuery))) {
37
+ return cached
38
+ }
39
+
40
+ const frontmatter = parseFrontmatter(src)
41
+ const content = frontmatter.content
42
+
43
+ // the render method has been augmented to allow plugins to
44
+ // register data during render
45
+ const { html, data: { hoistedTags, links }, dataBlockString } = markdown.render(content)
46
+
47
+ // check if relative links are valid
48
+ links && links.forEach(link => {
49
+ link = decodeURIComponent(link)
50
+
51
+ const shortname = link
52
+ .replace(/#.*$/, '')
53
+ .replace(/\.html$/, '.md')
54
+
55
+ const filename = shortname
56
+ .replace(/\/$/, '/README.md')
57
+ .replace(/^\//, sourceDir + '/')
58
+
59
+ const altname = shortname
60
+ .replace(/\/$/, '/index.md')
61
+ .replace(/^\//, sourceDir + '/')
62
+
63
+ const dir = path.dirname(this.resourcePath)
64
+ const file = path.resolve(dir, filename)
65
+ const altfile = altname !== filename ? path.resolve(dir, altname) : null
66
+
67
+ if (!fs.existsSync(file) && (!altfile || !fs.existsSync(altfile))) {
68
+ this.emitWarning(
69
+ new Error(
70
+ `\nFile for relative link "${link}" does not exist.\n` +
71
+ `(Resolved file: ${file})\n`
72
+ )
73
+ )
74
+ }
75
+ })
76
+
77
+ const res = (
78
+ `<template>\n` +
79
+ `<div>${html}</div>\n` +
80
+ `</template>\n` +
81
+ `<script>
82
+ export default { }
83
+ </script>` +
84
+ (hoistedTags || []).join('\n') +
85
+ `\n${dataBlockString}\n`
86
+ )
87
+ cache.set(key, res)
88
+ return res
89
+ }
90
+
91
+ module.exports.frontmatterEmitter = new EventEmitter()
@@ -0,0 +1,18 @@
1
+ const frontmatter = require('front-matter')
2
+ const startCase = require('lodash/startCase')
3
+ const { dirname, extname, relative } = require('path')
4
+
5
+ module.exports = function metadataLoader(source) {
6
+ this && this.cacheable && this.cacheable();
7
+
8
+ const metadata = {
9
+ title: startCase(dirname(this.resourcePath).split('/').pop()),
10
+ resourcePath: relative('./', this.resourcePath)
11
+ }
12
+
13
+ if (extname(this.resourcePath) === '.md') {
14
+ Object.assign(metadata, frontmatter(source).attributes)
15
+ }
16
+
17
+ return JSON.stringify(metadata)
18
+ }
@@ -0,0 +1,14 @@
1
+ const { promises: fs } = require('fs')
2
+ const getSassVars = require('get-sass-vars')
3
+
4
+ module.exports = async function sassExtractLoader() {
5
+ const callback = this.async()
6
+ try {
7
+ const css = await fs.readFile(this.resourcePath, 'utf-8')
8
+ const json = await getSassVars(css)
9
+ callback(null, `module.exports = ${JSON.stringify(json)}`)
10
+ } catch(_) {
11
+ callback(null, "module.exports = {}")
12
+ }
13
+ return
14
+ }
@@ -0,0 +1,14 @@
1
+ const vueDocs = require('vue-docgen-api')
2
+
3
+ module.exports = async function vueDocgenLoader() {
4
+ const callback = this.async()
5
+ const emptyApi = { "props": {}, "slots": {}, "events": {}, "methods": {} }
6
+ try {
7
+ const api = await vueDocs.parse(this.resourcePath)
8
+ const json = JSON.stringify(api, null, 2)
9
+ callback(null, `module.exports = ${json}`)
10
+ } catch (_) {
11
+ callback(null, `module.exports = ${emptyApi}`)
12
+ }
13
+ return
14
+ };