@tacc/core-styles 0.5.1

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 (166) hide show
  1. package/.postcssrc.base.yml +48 -0
  2. package/README.md +244 -0
  3. package/bin/build.js +40 -0
  4. package/bin/config.js +90 -0
  5. package/bin/version.js +24 -0
  6. package/cli.js +77 -0
  7. package/dist/branding_logos.css +2 -0
  8. package/dist/components/README.css +1 -0
  9. package/dist/components/bootstrap.container.css +2 -0
  10. package/dist/components/bootstrap.figure.css +2 -0
  11. package/dist/components/bootstrap.pagination.css +2 -0
  12. package/dist/components/c-button.css +2 -0
  13. package/dist/components/c-callout.css +2 -0
  14. package/dist/components/c-card.css +2 -0
  15. package/dist/components/c-data-list.css +2 -0
  16. package/dist/components/c-footer.css +2 -0
  17. package/dist/components/c-image-map.css +2 -0
  18. package/dist/components/c-image-map.skin.css +1 -0
  19. package/dist/components/c-image-map.structure.css +2 -0
  20. package/dist/components/c-nav.css +2 -0
  21. package/dist/components/c-page.css +2 -0
  22. package/dist/components/c-recognition.css +2 -0
  23. package/dist/components/c-see-all-link.css +2 -0
  24. package/dist/components/c-show-more.css +2 -0
  25. package/dist/elements/README.css +1 -0
  26. package/dist/elements/figure.css +2 -0
  27. package/dist/elements/html-elements.css +2 -0
  28. package/dist/elements/tacc-search-bar.css +2 -0
  29. package/dist/generics/README.css +1 -0
  30. package/dist/objects/README.css +1 -0
  31. package/dist/objects/o-flex-item-table-wrap.css +2 -0
  32. package/dist/objects/o-grid.css +2 -0
  33. package/dist/objects/o-offset-content.css +2 -0
  34. package/dist/objects/o-section.css +2 -0
  35. package/dist/objects/o-site.css +2 -0
  36. package/dist/settings/README.css +1 -0
  37. package/dist/settings/border.css +2 -0
  38. package/dist/settings/color.css +2 -0
  39. package/dist/settings/font.css +2 -0
  40. package/dist/settings/max-width.css +2 -0
  41. package/dist/settings/space.css +2 -0
  42. package/dist/tools/README.css +1 -0
  43. package/dist/tools/media-queries.css +1 -0
  44. package/dist/tools/x-article-link.css +2 -0
  45. package/dist/tools/x-center.css +2 -0
  46. package/dist/tools/x-fake-border.css +2 -0
  47. package/dist/tools/x-grid.css +1 -0
  48. package/dist/tools/x-layout.css +2 -0
  49. package/dist/tools/x-overlay.css +1 -0
  50. package/dist/tools/x-truncate.css +2 -0
  51. package/dist/trumps/README.css +1 -0
  52. package/dist/trumps/icon.css +2 -0
  53. package/dist/trumps/icon.fonts.css +2 -0
  54. package/dist/trumps/s-article-list.css +2 -0
  55. package/dist/trumps/s-article-preview.css +2 -0
  56. package/dist/trumps/s-blockquote.css +2 -0
  57. package/dist/trumps/s-breadcrumbs.css +2 -0
  58. package/dist/trumps/s-cms-nav.css +1 -0
  59. package/dist/trumps/s-document.css +2 -0
  60. package/dist/trumps/s-footer.css +2 -0
  61. package/dist/trumps/s-guide-doc.css +2 -0
  62. package/dist/trumps/s-header.css +2 -0
  63. package/dist/trumps/s-inline-dl.css +2 -0
  64. package/dist/trumps/s-portal-nav.css +2 -0
  65. package/dist/trumps/s-style-guide.css +2 -0
  66. package/dist/trumps/s-system-specs.css +2 -0
  67. package/dist/trumps/tacc-search-bar.css +2 -0
  68. package/dist/trumps/u-empty.css +1 -0
  69. package/dist/trumps/u-hide.css +2 -0
  70. package/dist/trumps/u-nested-text-content.css +2 -0
  71. package/index.js +45 -0
  72. package/package.json +49 -0
  73. package/source/README.md +8 -0
  74. package/source/_imports/README.md +47 -0
  75. package/source/_imports/branding_logos.css +73 -0
  76. package/source/_imports/components/README.css +26 -0
  77. package/source/_imports/components/bootstrap.container.css +23 -0
  78. package/source/_imports/components/bootstrap.figure.css +17 -0
  79. package/source/_imports/components/bootstrap.pagination.css +29 -0
  80. package/source/_imports/components/c-button.css +210 -0
  81. package/source/_imports/components/c-button.html +31 -0
  82. package/source/_imports/components/c-callout.css +183 -0
  83. package/source/_imports/components/c-callout.html +52 -0
  84. package/source/_imports/components/c-card.css +57 -0
  85. package/source/_imports/components/c-card.html +32 -0
  86. package/source/_imports/components/c-data-list.css +222 -0
  87. package/source/_imports/components/c-data-list.html +145 -0
  88. package/source/_imports/components/c-footer.css +67 -0
  89. package/source/_imports/components/c-footer.html +3 -0
  90. package/source/_imports/components/c-image-map.css +26 -0
  91. package/source/_imports/components/c-image-map.html +4 -0
  92. package/source/_imports/components/c-image-map.skin.css +1 -0
  93. package/source/_imports/components/c-image-map.structure.css +285 -0
  94. package/source/_imports/components/c-nav.css +164 -0
  95. package/source/_imports/components/c-nav.html +45 -0
  96. package/source/_imports/components/c-page.css +95 -0
  97. package/source/_imports/components/c-page.html +192 -0
  98. package/source/_imports/components/c-recognition.css +102 -0
  99. package/source/_imports/components/c-see-all-link.css +52 -0
  100. package/source/_imports/components/c-show-more.css +50 -0
  101. package/source/_imports/elements/README.css +47 -0
  102. package/source/_imports/elements/figure.css +23 -0
  103. package/source/_imports/elements/html-elements.css +386 -0
  104. package/source/_imports/elements/tacc-search-bar.css +19 -0
  105. package/source/_imports/elements/tacc-search-bar.md +20 -0
  106. package/source/_imports/generics/README.css +24 -0
  107. package/source/_imports/generics/README.md +9 -0
  108. package/source/_imports/objects/README.css +22 -0
  109. package/source/_imports/objects/o-flex-item-table-wrap.css +50 -0
  110. package/source/_imports/objects/o-grid.css +131 -0
  111. package/source/_imports/objects/o-grid.html +64 -0
  112. package/source/_imports/objects/o-offset-content.css +51 -0
  113. package/source/_imports/objects/o-section.css +270 -0
  114. package/source/_imports/objects/o-section.html +73 -0
  115. package/source/_imports/objects/o-site.css +26 -0
  116. package/source/_imports/objects/o-site.html +11 -0
  117. package/source/_imports/settings/README.css +65 -0
  118. package/source/_imports/settings/border.css +15 -0
  119. package/source/_imports/settings/color.css +30 -0
  120. package/source/_imports/settings/font.css +49 -0
  121. package/source/_imports/settings/max-width.css +31 -0
  122. package/source/_imports/settings/space.css +36 -0
  123. package/source/_imports/tools/README.css +17 -0
  124. package/source/_imports/tools/media-queries.css +48 -0
  125. package/source/_imports/tools/x-article-link.css +62 -0
  126. package/source/_imports/tools/x-center.css +60 -0
  127. package/source/_imports/tools/x-fake-border.css +72 -0
  128. package/source/_imports/tools/x-grid.css +116 -0
  129. package/source/_imports/tools/x-layout.css +86 -0
  130. package/source/_imports/tools/x-overlay.css +28 -0
  131. package/source/_imports/tools/x-truncate.css +47 -0
  132. package/source/_imports/trumps/README.css +79 -0
  133. package/source/_imports/trumps/icon.css +31 -0
  134. package/source/_imports/trumps/icon.fonts.css +316 -0
  135. package/source/_imports/trumps/s-article-list.css +240 -0
  136. package/source/_imports/trumps/s-article-list.html +20 -0
  137. package/source/_imports/trumps/s-article-preview.css +253 -0
  138. package/source/_imports/trumps/s-article-preview.html +30 -0
  139. package/source/_imports/trumps/s-blockquote.css +45 -0
  140. package/source/_imports/trumps/s-breadcrumbs.css +69 -0
  141. package/source/_imports/trumps/s-cms-nav.css +11 -0
  142. package/source/_imports/trumps/s-cms-nav.html +41 -0
  143. package/source/_imports/trumps/s-document.css +142 -0
  144. package/source/_imports/trumps/s-footer.css +16 -0
  145. package/source/_imports/trumps/s-footer.html +3 -0
  146. package/source/_imports/trumps/s-guide-doc.css +77 -0
  147. package/source/_imports/trumps/s-header.css +181 -0
  148. package/source/_imports/trumps/s-header.html +46 -0
  149. package/source/_imports/trumps/s-inline-dl.css +35 -0
  150. package/source/_imports/trumps/s-portal-nav.css +20 -0
  151. package/source/_imports/trumps/s-portal-nav.html +37 -0
  152. package/source/_imports/trumps/s-style-guide.css +52 -0
  153. package/source/_imports/trumps/s-system-specs.css +123 -0
  154. package/source/_imports/trumps/tacc-search-bar.css +108 -0
  155. package/source/_imports/trumps/tacc-search-bar.html +11 -0
  156. package/source/_imports/trumps/u-empty.css +18 -0
  157. package/source/_imports/trumps/u-hide.css +27 -0
  158. package/source/_imports/trumps/u-nested-text-content.css +14 -0
  159. package/source/_tests/README.md +33 -0
  160. package/source/_tests/postcss-extend.css +80 -0
  161. package/source/_tests/postcss-preset-env.css +75 -0
  162. package/source/_tests.css +12 -0
  163. package/source/_themes/README.md +5 -0
  164. package/source/_themes/TODO.md +4 -0
  165. package/source/_themes/default.json +21 -0
  166. package/source/_themes/has-dark-logo.json +21 -0
@@ -0,0 +1,48 @@
1
+ plugins:
2
+
3
+
4
+ postcss-import:
5
+ path:
6
+ - 'source'
7
+
8
+
9
+ postcss-extend: {}
10
+
11
+
12
+ # https://github.com/TACC/Core-CMS/blob/70a1ca3/conf/css/.postcssrc.yml#L6-L12
13
+ postcss-env-function:
14
+ importFrom:
15
+ - 'source/_themes/default.json'
16
+
17
+
18
+ postcss-preset-env:
19
+
20
+ # https://github.com/csstools/postcss-preset-env#features
21
+ stage: false
22
+
23
+ # https://github.com/csstools/postcss-preset-env/blob/master/src/lib/plugins-by-id.js#L35
24
+ features:
25
+ custom-media-queries: true
26
+ media-query-ranges: true
27
+ # RFE: Fix bug on the Internet so we can use these reliably
28
+ # SEE: https://github.com/postcss/postcss-custom-selectors/issues/40
29
+ custom-selectors: true
30
+
31
+
32
+ cssnano:
33
+ preset:
34
+ - 'default'
35
+ -
36
+ # Both of these are disabled to allow manual CSS build tests
37
+ # The `discardDuplicates` is disabled to prevent hiding duplicate CSS
38
+ discardDuplicates:
39
+ exclude: true
40
+ mergeRules:
41
+ exclude: true
42
+
43
+
44
+
45
+ postcss-banner:
46
+ banner: 'no build id'
47
+ inline: true
48
+ important: true
package/README.md ADDED
@@ -0,0 +1,244 @@
1
+ # TACC Core Styles
2
+
3
+ The shared styles for TACC WMA Workspace Portals & Websites
4
+
5
+ > __Notice__: Currently only [Core CMS] is using these styles.
6
+
7
+
8
+ ## Related Repositories
9
+
10
+ - [Core CMS], the base CMS code for TACC WMA CMS Websites
11
+
12
+
13
+ ## External Project Usage
14
+
15
+ ### CLI
16
+
17
+ ```bash
18
+ Usage: core-styles [options] [command]
19
+
20
+ Options:
21
+ -V, --version output the version number
22
+ -h, --help display help for command
23
+
24
+ Commands:
25
+ build [options] build stylesheets with TACC standard process:
26
+ - "post-css" plugins
27
+ - custom input path
28
+ - custom output path
29
+ - custom configs
30
+ - prepend build id
31
+
32
+ help [command] display help for command
33
+ ```
34
+
35
+ #### Build Command
36
+
37
+ ```bash
38
+ Usage: core-styles build [options]
39
+
40
+ build stylesheets with TACC standard process:
41
+ - "post-css" plugins
42
+ - custom input path
43
+ - custom output path
44
+ - custom configs
45
+ - prepend build id
46
+
47
+ Options:
48
+ -i, --input <path> parse source at which path¹
49
+ -o, --output <path> output CSS files to which path¹
50
+ -v, --verbose print more info during build process
51
+ -c, --custom-configs <paths...> extend base config with YAML files²³
52
+ -b, --build-id <identifier> any value to identify the build (default: version of app)
53
+ -m, --base-mirror-dir <path> if input folder structure is mirrored, this path is not⁴
54
+ -h, --help display help for command
55
+
56
+ Notes:
57
+ ¹ Folder structure of "--input-dir" mirrored in "--output-dir" i.e.
58
+
59
+ given input
60
+ - "input_dir/x.css"
61
+ - "input_dir/sub_dir_a/y.css"
62
+ - "input_dir"
63
+ - "input_dir/**/*"
64
+
65
+ expect output
66
+ - "output_dir/x.css"
67
+ - "output_dir/sub_dir_a/y.css"
68
+ - "output_dir/..." (all files from input not in sub-directories)
69
+ - "output_dir/.../..." (all files from input as nested)
70
+
71
+ ² The file formats are like ".postcssrc.yml" from
72
+ https://github.com/postcss/postcss-load-config#postcssrc
73
+
74
+ ³ The first file is merged on top of the base config.
75
+ Each successive file overwrites the file before it.
76
+
77
+ ⁴ Given '-i "a/b*" -o "x/" -m "a/"' output is "x/b/...".
78
+ Given '-i "a/b*" -o "x/" -m "a/b/"' output is "x/...".
79
+ Given '-i "a/b*" -o "x/" -m "not-a/"' output is "x/abs-path-to-input/...".
80
+ ```
81
+
82
+ ### Module
83
+
84
+ 1. Install the package with any package manager e.g.:
85
+ - `npm install TACC/Core-Styles`
86
+ - `yarn add TACC/Core-Styles`
87
+
88
+ 2. Import stylesheets of either type:
89
+ - pre-compiled, from `/dist`
90
+ - source files, from `/source`
91
+
92
+ #### Build Script
93
+
94
+ ```js
95
+ const buildStylesheets = require('core-styles');
96
+
97
+ buildStylesheets(
98
+ // Parse CSS files from which directory (required)
99
+ `path/to/your/css/src`,
100
+ // Output CSS files to which directory (required)
101
+ `path/to/put/css/output`, {
102
+ // List of YAML config files (optional)
103
+ // (The first file is merged on top of the base config.)
104
+ // (Each successive file overwrites the file before it.)
105
+ // SEE: https://github.com/postcss/postcss-load-config#postcssrc
106
+ customConfigs: [
107
+ // The "base" config is `/.postcssrc.base.yml`
108
+ `path/to/custom/configthat/extends/base/.postcssrc.yml`,
109
+ `path/to/custom/config/that/extends/above/.postcssrc.yml`
110
+ ],
111
+ // Print more info from build log (optional, default: false)
112
+ verbose: true,
113
+ // Print version of this software (optional, default: false)
114
+ version: true,
115
+ // Extension of CSS files to parse (optional, default: "css")
116
+ fileExt: 'css',
117
+ // Any value to help identify the build (optional, default: app version)
118
+ buildId: process.env.npm_package_version + someUniqueId
119
+ }
120
+ );
121
+ ```
122
+
123
+ ## Local Development Setup
124
+
125
+ ### Prequisites for Building the Styles
126
+
127
+ * Nodejs 16.x
128
+
129
+ > __Future__: The Core Styles will be rendered via a pattern library software.
130
+
131
+ ### Code Configuration
132
+
133
+ Code configuration happens in repos that use these styles.
134
+
135
+ ### Previewing the Styles
136
+
137
+ 1. [Install][npm-install] the dependencies:
138
+
139
+ ```bash
140
+ npm ci
141
+ ```
142
+
143
+ > __Future__:
144
+ >
145
+ > 2. Build stylesheets + Run the pattern library:
146
+ >
147
+ > ```bash
148
+ > npm start
149
+ > ```
150
+ >
151
+ > 3. Open the web interface.
152
+ >
153
+ > The build command will output the URL (and may even open it for you).
154
+
155
+
156
+ [npm-install]: https://docs.npmjs.com/cli/v8/commands/npm-ci
157
+
158
+ ### Source Files
159
+
160
+ If you changes files in a `source/` directory, you may need to follow some of these steps.
161
+
162
+ #### Quick Start
163
+
164
+ 1. _(optional)_ Make changes to `/source` files.
165
+ 2. Build the styles: `npm run build`
166
+
167
+ > __Future__: 2. Build and preview the styles: `npm start`
168
+
169
+ 3. _(to debug)_ Review respective `/dist` files' content.
170
+
171
+ #### How to Just Build Stylesheets
172
+
173
+ You can build stylesheets __from__ source files __in__ `source` directory __to__ compiled files __in__ `dist` directory.
174
+
175
+ 0. (Optional) Set version (for preserved comment):
176
+
177
+ ```bash
178
+ npm run version -- --build-id="$(git describe --always)"
179
+ ```
180
+
181
+ 1. Build stylesheets:
182
+
183
+ ```bash
184
+ npm run build
185
+ ```
186
+
187
+
188
+ ## Testing
189
+
190
+ Plugin testing is done manually. Run `npm run build` from root folder in this project, then review output in `/dist/_tests.css`, to ensure plugins are working correctly.
191
+
192
+ Style testing is done manually. Run `npm start` from root folder in this project, then review output at web interface, to ensure styles are rendering correctly.
193
+
194
+ ### Production Deployment
195
+
196
+ The Core Styles are not deployed alone _yet_. ¹
197
+
198
+ _For now_, the stylesheets are acquired or accessed by other repositories.
199
+
200
+ | Repo | Usage |
201
+ | - | - |
202
+ | __[Core CMS]__ | via CLI installed on test branch |
203
+ | __[Core CMS Pattern Library]__ | not accessing styles [_yet_][research-pattern-lib] ¹ |
204
+
205
+ <sub>¹ A repo that is, or will be, in [Core CMS Pattern Library] should load these styles __and__ build a pattern library.</sub>
206
+
207
+ [Core CMS Pattern Library]: https://github.com/wesleyboar/Core-CMS-Pattern-Library
208
+ [research-pattern-lib]: https://confluence.tacc.utexas.edu/x/FADMBQ
209
+
210
+
211
+ ## Contributing
212
+
213
+ ### Development Workflow
214
+
215
+ We use a modifed version of [GitFlow](https://datasift.github.io/gitflow/IntroducingGitFlow.html) as our development workflow. Our [development site](https://dev.cep.tacc.utexas.edu) (accessible behind the TACC Network) is always up-to-date with `main`, while the [production site](https://prod.cep.tacc.utexas.edu) is built to a hashed commit tag.
216
+ - Feature branches contain major updates, bug fixes, and hot fixes with respective branch prefixes:
217
+ - `task/` for features and updates
218
+ - `bug/` for bugfixes
219
+ - `fix/` for hotfixes
220
+
221
+ ### Best Practices
222
+
223
+ Sign your commits ([see this link](https://help.github.com/en/github/authenticating-to-github/managing-commit-signature-verification) for help)
224
+
225
+ ### Publishing Workflow
226
+
227
+ 1. Create new branch for version bump.
228
+ 1. Update `CHANGELOG.md`.
229
+ 1. Update version in `package.json`.
230
+ 1. Update version in `package-lock.json` by running `npm i --package-lock-only`.
231
+ 1. Commit, push, PR, review, merge.
232
+ 1. Create new GitHub Release.
233
+
234
+ ### Resources
235
+
236
+ * [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
237
+
238
+
239
+ <!-- Link Aliases -->
240
+
241
+ [Core Portal Deployments]: https://github.com/TACC/Core-Portal-Deployments
242
+ [Camino]: https://github.com/TACC/Camino
243
+ [Core CMS]: https://github.com/TACC/Core-CMS
244
+ [Core Portal]: https://github.com/TACC/Core-Portal
package/bin/build.js ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+
3
+ /** Export internal function used by this package to build styles */
4
+
5
+ const cmd = require('node-cmd');
6
+
7
+ // SEE: https://stackoverflow.com/a/63530170
8
+ process.env.FORCE_COLOR = true
9
+
10
+
11
+
12
+ /**
13
+ * Build stylesheets from source CSS
14
+ * @param {string} input - Parse CSS files from which path
15
+ * @param {string} output - Output CSS files to which path
16
+ * @param {object} [opts={}] - Options
17
+ * @param {string} [opts.baseMirrorDir] - Do not add this path when mirroring
18
+ * @param {string} [opts.configDir] - Custom config directory
19
+ * @param {boolean} [opts.verbose=false] - To print more info from build log
20
+ * @param {boolean} [opts.verbose=false] - To print more info from build log
21
+ */
22
+ function build(input, output, opts = {}) {
23
+ // Get data
24
+ const configDir = opts.configDir || `${__dirname}/../`;
25
+ const verbose = (opts.verbose === true) ? '--verbose' : '';
26
+ const base = (opts.baseMirrorDir) ? `--base "${opts.baseMirrorDir}"` : '';
27
+
28
+ // Build command
29
+ const command = `postcss "${input}" --dir "${output}" ${verbose} --config "${configDir}" ${base}`;
30
+
31
+ console.log(`Building stylesheet(s) to ${output}`);
32
+
33
+ // Run command
34
+ cmd.runSync(command);
35
+ }
36
+
37
+
38
+
39
+ // Export
40
+ module.exports = build;
package/bin/config.js ADDED
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+
3
+ /** Export internal function used by this package to configure build */
4
+
5
+ const fs = require('fs');
6
+ const merge = require('merge-lite');
7
+ const yaml = require('js-yaml');
8
+
9
+ const BASE_CONFIG_FILE = `${__dirname}/../.postcssrc.base.yml`;
10
+ const NEW_CONFIG_FILE = `${__dirname}/../.postcssrc.yml`;
11
+
12
+
13
+
14
+ /**
15
+ * Save base config as auto-loaded file (also can overwrite with custom values)
16
+ * @param {array.string} [customConfigFiles=[]] - List of YAML config file paths
17
+ * (The first file is merged on top of the base config.)
18
+ * (Each successive file overwrites the file before it.)
19
+ * @param {string} [cssVersion] - A versioning identifier for this build
20
+ * @see https://github.com/postcss/postcss-load-config#postcssrc
21
+ */
22
+ function config(customConfigFiles = [], cssVersion) {
23
+ // Prepare data
24
+ const configFiles = [ BASE_CONFIG_FILE, ...customConfigFiles ];
25
+ const configObjects = [];
26
+ let newJson;
27
+
28
+ // Initialize final config file
29
+ emptyOrCreateFile( NEW_CONFIG_FILE );
30
+
31
+ // Merge configs in order
32
+ configFiles.forEach( nextFile => {
33
+ newJson = getConfigObject( nextFile );
34
+ configObjects.push( newJson );
35
+ });
36
+ mergedJson = merge( ...configObjects );
37
+
38
+ // Update version property
39
+ const updatedJson = updateVersion( mergedJson, cssVersion );
40
+ const configYaml = yaml.dump( updatedJson );
41
+
42
+ // Write final config file
43
+ fs.writeFileSync( NEW_CONFIG_FILE, configYaml, 'utf8');
44
+ }
45
+
46
+
47
+
48
+ /**
49
+ * Update the value for the CSS version in given config data
50
+ * @param {object} config - The config data in which to update the version
51
+ * @param {string} version - The version identifier
52
+ * @return {object} - Updated config
53
+ */
54
+ function updateVersion( config, version ) {
55
+ console.log(`Tagging CSS version as ${version}`);
56
+
57
+ config['plugins']['postcss-banner']['banner'] = version;
58
+
59
+ return config;
60
+ }
61
+
62
+
63
+
64
+ /**
65
+ * Get JSON from YAML config file
66
+ * @param {string} filePath - YAML config file
67
+ * @return {object} - Config as JSON
68
+ */
69
+ function getConfigObject( filePath ) {
70
+ const config = fs.readFileSync( filePath, 'utf8');
71
+ const json = yaml.load( config );
72
+
73
+ return json;
74
+ }
75
+
76
+
77
+
78
+ /**
79
+ * If file exists, empty it; otherwise, create it
80
+ * @param {string} [filePath] - The file to empty or create
81
+ * @see https://stackoverflow.com/a/29016268/11817077
82
+ */
83
+ function emptyOrCreateFile( filePath ) {
84
+ fs.closeSync( fs.openSync( filePath, 'w') );
85
+ }
86
+
87
+
88
+
89
+ // Export
90
+ module.exports = config;
package/bin/version.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+
3
+ /** Create CSS version based on lifecycle app data and given data */
4
+
5
+ const package = require(process.env.npm_package_json || '../package.json');
6
+
7
+
8
+ /**
9
+ * Create version from app data and given data
10
+ * @param {string} [buildId] - Any value to identify the build
11
+ */
12
+ function create(buildId) {
13
+ const appName = package.name;
14
+ const appVersion = buildId || package.version + '+';
15
+ const appLicense = package.license;
16
+ const appWebsite = package.homepage.replace('https://', '');
17
+
18
+ return `${appName} ${appVersion} | ${appLicense} | ${appWebsite}`;
19
+ }
20
+
21
+
22
+
23
+ // Export
24
+ module.exports = create;
package/cli.js ADDED
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env node
2
+
3
+ /** CLI to custom build stylesheets and create a version stylesheet */
4
+
5
+ const { program, Option } = require('commander');
6
+
7
+ const package = require(process.env.npm_package_json || './package.json');
8
+
9
+ const { buildStylesheets } = require('./index.js');
10
+
11
+
12
+
13
+ // Setup
14
+ program
15
+ .name('core-styles')
16
+ .version(package.version)
17
+ .showHelpAfterError('(add --help for additional information)');
18
+
19
+
20
+
21
+ // Build Command
22
+ program
23
+ .command('build')
24
+ .description(`build stylesheets with TACC standard process:
25
+ - "post-css" plugins
26
+ - custom input path
27
+ - custom output path
28
+ - custom configs
29
+ - prepend build id
30
+ `)
31
+ .requiredOption('-i, --input <path>',
32
+ 'parse source at which path¹')
33
+ .requiredOption('-o, --output <path>',
34
+ 'output CSS files to which path¹')
35
+ .option('-v, --verbose',
36
+ 'print more info during build process')
37
+ .option('-c, --custom-configs <paths...>',
38
+ `extend base config with YAML files²³`)
39
+ .option('-b, --build-id <identifier>',
40
+ 'any value to identify the build (default: version of app)')
41
+ .option('-m, --base-mirror-dir <path>',
42
+ 'if input folder structure is mirrored, this path is not⁴')
43
+ .addHelpText('after', `
44
+ Notes:
45
+ ¹ Folder structure of "--input-dir" mirrored in "--output-dir" i.e.
46
+
47
+ given input
48
+ - "input_dir/x.css"
49
+ - "input_dir/sub_dir_a/y.css"
50
+ - "input_dir"
51
+ - "input_dir/**/*"
52
+
53
+ expect output
54
+ - "output_dir/x.css"
55
+ - "output_dir/sub_dir_a/y.css"
56
+ - "output_dir/..." (all files from input not in sub-directories)
57
+ - "output_dir/.../..." (all files from input as nested)
58
+
59
+ ² The file formats are like ".postcssrc.yml" from
60
+ https://github.com/postcss/postcss-load-config#postcssrc
61
+
62
+ ³ The first file is merged on top of the base config.
63
+ Each successive file overwrites the file before it.
64
+
65
+ ⁴ Given '-i "a/b*" -o "x/" -m "a/"' output is "x/b/...".
66
+ Given '-i "a/b*" -o "x/" -m "a/b/"' output is "x/...".
67
+ Given '-i "a/b*" -o "x/" -m "not-a/"' output is "x/abs-path-to-input/...".
68
+ `).action( programOpts => {
69
+ const { input, output, ...opts } = programOpts;
70
+
71
+ buildStylesheets( input, output, opts );
72
+ });
73
+
74
+
75
+
76
+ // Parse
77
+ program.parse(process.argv);
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .branding-header{--branding-logo-height:24px;display:flex;align-items:center;justify-content:center;height:49px;background-color:var(--global-color-primary--xx-dark);color:var(--global-color-primary--xx-light);border-bottom:1px solid var(--global-color-primary--normal)}.branding-seperator{width:1px;height:100%;max-height:var(--branding-logo-height);border-left:1px solid var(--global-color-primary--xx-light);margin:0 15px;vertical-align:middle}.branding-logo{height:30px;margin:0;padding:0;border:none}.branding-logo--short{height:var(--branding-logo-height)}.branding-logo--tall{height:35px}.branding-nsf{height:35px}.branding-tacc{height:var(--branding-logo-height)}.branding-utaustin{height:var(--branding-logo-height)}.portal-logo{float:left;height:40px;margin:0;padding:0;border:none}
@@ -0,0 +1 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ @media (min-width:1400px){.container{max-width:var(--global-max-width--x-wide)}}@media (min-width:1680px){.container{max-width:var(--global-max-width--xx-wide)}}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .figure>img,figure>img{margin-bottom:20px}.figure-caption,figcaption{color:var(--global-color-primary--dark);font-size:var(--global-font-size--medium);border-top:var(--global-border-width--normal) solid var(--global-color-primary--normal);padding-top:12px}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .c-page-list,.pagination{--item-width:2em;--item-buffer:3px;--item-border:var(--global-border-width--normal)}.c-page-list,.pagination{display:flex;flex-direction:row;align-items:baseline;list-style:none;font-size:14px}ul.c-page-list{list-style:none}.c-page-link--always-click{position:relative;box-sizing:content-box}.c-page-link--always-click:after,.c-page-link--always-click:before{--width:var(--item-buffer);--vert-offset:calc(var(--item-border)*-1);--horz-offset:calc(100% + var(--item-border));content:"";width:var(--width);position:absolute;top:var(--vert-offset);bottom:var(--vert-offset)}.c-page-link--always-click.c-button{overflow:visible}.c-page-link--always-click:before{right:var(--horz-offset)}.c-page-link--always-click:after{left:var(--horz-offset)}.c-page-item{margin-inline:var(--item-buffer)}.c-page-item:first-child{margin-left:0}.c-page-item:last-child{margin-right:0}.c-page-item--etcetera{min-width:var(--item-width);margin-inline:2px;text-align:center;cursor:default}.c-page-end,.pagination a,.pagination span{padding:4px 12px}.c-page-link{padding:5px 0;min-width:var(--item-width);line-height:1.2}.pagination{margin-block:var(--global-space--x-large);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;margin-inline:auto}.pagination a,.pagination span{padding-block:0}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ [class*=c-button]{--min-width:75px;--mid-width:110px;--max-width:130px}.c-button{display:inline-block;border-width:var(--global-border-width--normal);border-style:solid;font-weight:500;font-size:.75rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.c-button:disabled{opacity:.5;pointer-events:none}.c-button:not(:disabled){cursor:pointer}.c-button:active:not(:disabled){transform:translateY(1px)}.c-button--primary,.c-button--secondary{padding:6px 18px;min-width:var(--min-width);max-width:var(--max-width)}.c-button--primary:hover{color:var(--global-color-primary--xx-light);background-color:var(--global-color-accent--dark);border-color:var(--global-color-accent--dark)}.c-button--primary:active{color:var(--global-color-primary--xx-light);background-color:var(--global-color-accent--x-dark);border-color:var(--global-color-accent--dark);border-width:var(--global-border-width--normal);outline:var(--global-border-width--normal) solid var(--global-color-accent--dark)}.c-button--primary:focus:not(:active){color:var(--global-color-primary--xx-light);background-color:var(--global-color-accent--normal);border-color:var(--global-color-primary--xx-light);outline:var(--global-border-width--normal) solid var(--global-color-accent--light)}.c-button--primary:not(.c-button:hover,.c-button:focus,.c-button:active){color:var(--global-color-primary--xx-light);background-color:var(--global-color-accent--normal);border-color:var(--global-color-accent--normal)}.c-button--secondary:hover{color:var(--global-color-primary--xx-dark);background-color:var(--global-color-primary--light);border-color:var(--global-color-accent--dark)}.c-button--secondary:active{color:var(--global-color-primary--xx-dark);background-color:var(--global-color-accent--x-light);border-color:var(--global-color-accent--dark);border-width:var(--global-border-width--normal);outline:var(--global-border-width--normal) solid var(--global-color-accent--dark)}.c-button--secondary:focus:not(:active){color:var(--global-color-primary--xx-dark);background-color:var(--global-color-primary--light);border-color:var(--global-color-primary--xx-dark);outline:var(--global-border-width--thick) solid var(--global-color-accent--light)}.c-button--secondary:not(.c-button:hover,.c-button:focus,.c-button:active){color:var(--global-color-primary--xx-dark);background-color:var(--global-color-primary--xx-light);border-color:var(--global-color-primary--xx-dark)}.c-button--is-active:not(.c-button:hover,.c-button:focus,.c-button:active){background-color:var(--global-color-accent--x-light)}.c-button--as-link{color:var(--global-color-accent--dark);background:unset;border:unset;padding-inline:unset}.c-button--as-link:not(:disabled):hover{text-decoration:underline}.c-button--width-short{width:var(--min-width)}.c-button--width-medium{width:var(--mid-width)}.c-button--width-long{width:var(--max-width)}.c-button--size-small{min-width:0;padding:3px 9px;line-height:1}.c-button__icon--before{margin-right:.5em}.c-button__icon--after{margin-left:.5em}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .x-article-link-stretch{position:absolute;height:100%;width:100%;top:0;left:0;overflow:hidden}.x-article-link-stretch--gapless{width:calc(100% + 30px);left:-15px}.x-article-link-hover,a.c-callout:hover{--outline-offset:1em;outline:1px solid var(--global-color-accent--normal);outline-offset:var(--outline-offset)}.x-article-link-hover--gapless{--outline-offset:0}a.c-callout:active{outline:1px dotted var(--global-color-accent--normal)}.c-callout{--figure-width--no-units:310;--figure-height--no-units:130;display:grid}.c-callout>:is(img,figure){grid-area:figure}.c-callout>:is(h1,h2,h3,h4,h5,h6){grid-area:title}.c-callout>p{grid-area:desc}.c-callout>p{margin-top:0}.c-callout>figure>img,.c-callout>img{-o-object-fit:cover;object-fit:cover;aspect-ratio:var(--figure-width--no-units)/var(--figure-height--no-units)}.c-callout>figure{width:-webkit-min-content;width:-moz-min-content;width:min-content}@media only screen and (min-width:768px){.c-callout{padding:20px;text-align:left;grid-template-columns:-webkit-min-content auto;grid-template-columns:min-content auto;grid-template-rows:auto -webkit-min-content;grid-template-rows:auto min-content;grid-template-areas:"figure title" "figure desc"}.c-callout>figure{margin:0}.c-callout>:is(img,figure){margin-right:40px}.c-callout>figure>img,.c-callout>img{width:calc(var(--figure-width--no-units)*1px);max-width:-webkit-fit-content;max-width:-moz-fit-content;max-width:fit-content}.c-callout>img{min-height:100%}}@media only screen and (max-width:767px){.c-callout{padding:20px 40px;text-align:center;grid-template-areas:"figure" "title" "desc"}.c-callout>figure{margin:0}.c-callout>:is(img,figure){margin-bottom:20px}.c-callout>figure>img,.c-callout>img{height:calc(var(--figure-height--no-units)*1px);max-height:-webkit-fit-content;max-height:-moz-fit-content;max-height:fit-content}.c-callout>img{min-width:100%}}.c-callout>:is(img,figure){place-self:center}.c-callout>p{padding-right:1%}.c-callout{background-color:var(--global-color-link-on-light--normal)}.c-callout>:is(h1,h2,h3,h4,h5,h6){margin-top:0;padding-bottom:12px;margin-bottom:12px;border-bottom:1px solid var(--global-color-primary--xx-light);font-size:var(--global-font-size--x-large);font-weight:var(--medium)}.c-callout>:is(h1,h2,h3,h4,h5,h6),[class*=o-section--style] .c-callout>:is(h1,h2,h3,h4,h5,h6){color:var(--global-color-primary--xx-light)}.c-callout>:not(h1,h2,h3,h4,h5,h6){color:var(--global-color-primary--xx-light)}.c-callout>:not(h1,h2,h3,h4,h5,h6,figure){font-size:var(--global-font-size--large);font-weight:var(--medium)}a.c-callout:hover{text-decoration:none}a.c-callout:focus{text-decoration:none}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .x-article-link-stretch{position:absolute;height:100%;width:100%;top:0;left:0;overflow:hidden}.x-article-link-stretch--gapless{width:calc(100% + 30px);left:-15px}.x-article-link-hover,a.c-card--frontera-about-page:hover{--outline-offset:1em;outline:1px solid var(--global-color-accent--normal);outline-offset:var(--outline-offset)}.x-article-link-hover--gapless{--outline-offset:0}a.c-card--frontera-about-page:active{outline:1px dotted var(--global-color-accent--normal)}.c-card--frontera-about-page{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;border-bottom:var(--global-border-width--normal) solid var(--global-color-primary--dark);margin-bottom:4.6rem}a.c-card--frontera-about-page{display:inline-block;text-decoration:none}.c-card--frontera-about-page img+h3{margin-top:1.6rem}.c-card--frontera-about-page img~:last-child{margin-bottom:1.25rem}.c-card--frontera-about-page figure{margin:0}.c-card--frontera-about-page figcaption{color:var(--global-color-primary--xx-dark);font-size:var(--global-font-size--x-large);font-weight:var(--bold);margin-top:1.6rem;margin-bottom:1.25rem}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .x-truncate--many-lines{--lines:2;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:var(--lines)}.x-untruncate--many-lines{overflow:visible;-webkit-line-clamp:inherit}.c-data-list--should-truncate-values .c-data-list__value,.c-data-list__key,.x-truncate--one-line{text-overflow:var(--text-overflow,ellipsis);overflow:hidden;white-space:nowrap}.x-untruncate--one-line{overflow:visible;white-space:normal}table.c-data-list{border-left:0;border-right:0}@supports(text-overflow:":"){.c-data-list__key:not(th){--text-overflow:":"}}td.c-data-list__value,th.c-data-list__key{padding-block:.5em}.c-data-list__key:not(th):after{content:":";display:inline;padding-right:.25em}th.c-data-list__key{padding-right:.25em}.c-data-list--is-horz{display:flex;flex-direction:row}.c-data-list--is-horz dd.c-data-list__value,dl.c-data-list--is-horz{margin-bottom:0}table.c-data-list--is-horz tbody,table.c-data-list--is-horz tr{min-width:0;display:flex;flex-direction:row}.c-data-list--is-horz:not(table).c-data-list--is-narrow>.c-data-list__key~.c-data-list__key:before{padding-left:.5em;padding-right:.5em}.c-data-list--is-horz:not(table).c-data-list--is-wide>.c-data-list__key~.c-data-list__key:before{padding-left:1em;padding-right:1em}table.c-data-list--is-horz.c-data-list--is-narrow tr:not(:first-child) th.c-data-list__key{padding-left:.5em}table.c-data-list--is-horz.c-data-list--is-narrow td.c-data-list__value{margin-right:.5em}table.c-data-list--is-horz.c-data-list--is-wide tr:not(:first-child) th.c-data-list__key{padding-left:1em}table.c-data-list--is-horz.c-data-list--is-wide td.c-data-list__value{margin-right:1em}table.c-data-list--is-vert{width:100%;table-layout:fixed}.c-data-list--is-vert:not(table)>.c-data-list__value{margin-left:0}.c-data-list--is-vert:not(table).c-data-list--is-narrow>.c-data-list__value,table.c-data-list--is-vert.c-data-list--is-narrow td.c-data-list__value{padding-left:0}.c-data-list--is-vert:not(table).c-data-list--is-wide>.c-data-list__value,table.c-data-list--is-vert.c-data-list--is-wide td.c-data-list__value{padding-left:2.5em}table.c-data-list--is-vert th.c-data-list__key,td.c-data-list__value{border-left:0;border-right:0}table.c-data-list--is-horz td.c-data-list__value,table.c-data-list--is-horz th.c-data-list__key{border-top:0;border-bottom:0}table.c-data-list--is-horz tr:first-child th.c-data-list__key{border-left:0}table.c-data-list--is-horz th.c-data-list__key{border-right:0}.c-data-list--is-horz:not(table)>.c-data-list__key~.c-data-list__key:before{content:"|";display:inline-block}.c-data-list--is-horz:not(table){align-items:baseline}table.c-data-list--is-horz tr{align-items:baseline}table.c-data-list--is-vert td.c-data-list__value,table.c-data-list--is-vert th.c-data-list__key{vertical-align:baseline}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .c-footer{--line-height:1.5;--min-line-count:2;box-sizing:content-box;min-height:calc(var(--line-height)*var(--min-line-count)*1em);display:flex;flex-direction:column;justify-content:center;padding-top:20px;padding-bottom:20px;color:var(--global-color-primary--xx-light);background-color:var(--global-color-primary--xx-dark);font-size:12px;text-align:center}@media only screen and (max-width:640px){.c-footer{padding-left:5%;padding-right:5%}}@media only screen and (min-width:641px) and (max-width:767px){.c-footer{padding-left:7.5%;padding-right:7.5%}}@media only screen and (min-width:768px) and (max-width:991px){.c-footer{padding-left:10%;padding-right:10%}}@media only screen and (min-width:992px) and (max-width:1199px){.c-footer{padding-left:12.5%;padding-right:12.5%}}@media only screen and (min-width:1200px){.c-footer{padding-left:15%;padding-right:15%}}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .c-image-map{--button-shape-size:50px;--toggle-shape-size:60px;--caption-width:100%}.c-image-map--has-caption-toggle-alignment{--caption-toggle-offset-horz:0px;--caption-toggle-offset-vert:calc(var(--toggle-shape-size)/2 + 1em)}.c-image-map{display:table}@media only screen and (max-width:991px){.c-image-map{margin:0 auto}}.c-image-map__image{display:block;width:100%;max-width:495px}.c-image-map__item{width:100%}.c-image-map__item-caption{width:var(--caption-width)}@media only screen and (min-width:992px){.c-image-map__item-close{display:none!important}}.c-image-map__item-toggle{width:var(--toggle-shape-size);height:var(--toggle-shape-size);margin-top:calc(var(--toggle-shape-size)*-1/2);margin-left:calc(var(--toggle-shape-size)*-1/2)}.c-image-map{position:relative}.c-image-map:not(.c-image-map--should-position-items) .c-image-map__item{position:relative}.c-image-map:not(.c-image-map--should-position-items) .c-image-map__items{position:absolute;top:0;left:0;right:0}.c-image-map__item-caption{position:relative}@media only screen and (max-width:991px){.c-image-map__item-toggle{cursor:pointer}}.c-image-map__item-toggle~.c-image-map__item-caption{visibility:hidden}.c-image-map:not(:focus-within) .c-image-map__item:target .c-image-map__item-caption,.c-image-map__item-toggle:focus~.c-image-map__item-caption,.c-image-map__item:focus-within .c-image-map__item-caption{visibility:visible}@media only screen and (min-width:992px){.c-image-map__item-caption{visibility:visible!important}}button.c-image-map__item-close:hover,button.c-image-map__item-toggle:hover{cursor:pointer}a.c-image-map__item-close:hover,a.c-image-map__item-toggle:hover{text-decoration:none}button.c-image-map__item-close,button.c-image-map__item-toggle{border:none}.c-image-map--has-item-counters .c-image-map__item:before,.c-image-map__item-close,.c-image-map__item-toggle{display:flex;justify-content:center;align-items:center}.c-image-map--should-position-items .c-image-map__item,.c-image-map--should-position-items .c-image-map__item-toggle{position:absolute}.c-image-map--has-toggle-counters{counter-reset:items}.c-image-map--has-toggle-counters .c-image-map__item{counter-increment:items}.c-image-map--has-toggle-counters .c-image-map__item-toggle:before{content:counter(items)}.c-image-map--has-item-counters{counter-reset:items}.c-image-map--has-item-counters .c-image-map__item{counter-increment:items}.c-image-map--has-item-counters .c-image-map__item:before{content:counter(items)}@media only screen and (max-width:991px){.c-image-map--has-item-counters .c-image-map__item:before{display:none}}.c-image-map--has-item-counters .c-image-map__item--unmapped:before{display:none}.c-image-map--has-caption-toggle-alignment .c-image-map__item{scroll-snap-align:start;scroll-margin:var(--caption-toggle-offset-vert)}.c-image-map--has-caption-toggle-alignment .c-image-map__item-caption{left:var(--caption-toggle-offset-horz)}@media only screen and (max-width:991px){.c-image-map--has-caption-toggle-alignment .c-image-map__item--unmapped .c-image-map__item-toggle{left:50%!important}}@media only screen and (min-width:992px){.c-image-map--has-caption-toggle-alignment .c-image-map__item--unmapped .c-image-map__item-toggle{left:calc(var(--caption-toggle-offset-horz) + var(--caption-width))!important}}@media only screen and (max-width:991px){.c-image-map--has-caption-toggle-alignment .c-image-map__item-caption{z-index:1;margin-top:var(--caption-toggle-offset-vert)}}@media only screen and (min-width:992px){.c-image-map--has-caption-toggle-alignment .c-image-map__item-toggle{z-index:1}}
@@ -0,0 +1 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .c-image-map{--button-shape-size:50px;--toggle-shape-size:60px;--caption-width:100%}.c-image-map--has-caption-toggle-alignment{--caption-toggle-offset-horz:0px;--caption-toggle-offset-vert:calc(var(--toggle-shape-size)/2 + 1em)}.c-image-map{display:table}@media only screen and (max-width:991px){.c-image-map{margin:0 auto}}.c-image-map__image{display:block;width:100%;max-width:495px}.c-image-map__item{width:100%}.c-image-map__item-caption{width:var(--caption-width)}@media only screen and (min-width:992px){.c-image-map__item-close{display:none!important}}.c-image-map__item-toggle{width:var(--toggle-shape-size);height:var(--toggle-shape-size);margin-top:calc(var(--toggle-shape-size)*-1/2);margin-left:calc(var(--toggle-shape-size)*-1/2)}.c-image-map{position:relative}.c-image-map:not(.c-image-map--should-position-items) .c-image-map__item{position:relative}.c-image-map:not(.c-image-map--should-position-items) .c-image-map__items{position:absolute;top:0;left:0;right:0}.c-image-map__item-caption{position:relative}@media only screen and (max-width:991px){.c-image-map__item-toggle{cursor:pointer}}.c-image-map__item-toggle~.c-image-map__item-caption{visibility:hidden}.c-image-map:not(:focus-within) .c-image-map__item:target .c-image-map__item-caption,.c-image-map__item-toggle:focus~.c-image-map__item-caption,.c-image-map__item:focus-within .c-image-map__item-caption{visibility:visible}@media only screen and (min-width:992px){.c-image-map__item-caption{visibility:visible!important}}button.c-image-map__item-close:hover,button.c-image-map__item-toggle:hover{cursor:pointer}a.c-image-map__item-close:hover,a.c-image-map__item-toggle:hover{text-decoration:none}button.c-image-map__item-close,button.c-image-map__item-toggle{border:none}.c-image-map--has-item-counters .c-image-map__item:before,.c-image-map__item-close,.c-image-map__item-toggle{display:flex;justify-content:center;align-items:center}.c-image-map--should-position-items .c-image-map__item,.c-image-map--should-position-items .c-image-map__item-toggle{position:absolute}.c-image-map--has-toggle-counters{counter-reset:items}.c-image-map--has-toggle-counters .c-image-map__item{counter-increment:items}.c-image-map--has-toggle-counters .c-image-map__item-toggle:before{content:counter(items)}.c-image-map--has-item-counters{counter-reset:items}.c-image-map--has-item-counters .c-image-map__item{counter-increment:items}.c-image-map--has-item-counters .c-image-map__item:before{content:counter(items)}@media only screen and (max-width:991px){.c-image-map--has-item-counters .c-image-map__item:before{display:none}}.c-image-map--has-item-counters .c-image-map__item--unmapped:before{display:none}.c-image-map--has-caption-toggle-alignment .c-image-map__item{scroll-snap-align:start;scroll-margin:var(--caption-toggle-offset-vert)}.c-image-map--has-caption-toggle-alignment .c-image-map__item-caption{left:var(--caption-toggle-offset-horz)}@media only screen and (max-width:991px){.c-image-map--has-caption-toggle-alignment .c-image-map__item--unmapped .c-image-map__item-toggle{left:50%!important}}@media only screen and (min-width:992px){.c-image-map--has-caption-toggle-alignment .c-image-map__item--unmapped .c-image-map__item-toggle{left:calc(var(--caption-toggle-offset-horz) + var(--caption-width))!important}}@media only screen and (max-width:991px){.c-image-map--has-caption-toggle-alignment .c-image-map__item-caption{z-index:1;margin-top:var(--caption-toggle-offset-vert)}}@media only screen and (min-width:992px){.c-image-map--has-caption-toggle-alignment .c-image-map__item-toggle{z-index:1}}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ nav.c-nav{--link-padding:0.5em}nav.c-nav--boxed{--indent-small:calc(var(--global-space--list-indent)/4);--indent-medium:calc(var(--global-space--list-indent)/2);--indent-large:var(--global-space--list-indent);width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;border:var(--global-border--normal)}nav.c-nav--boxed :is(ul,ol){margin:0}nav.c-nav--boxed ul{list-style-type:none;padding-left:var(--indent-medium);padding-right:var(--indent-large)}@media (min-width:992px){nav.c-nav--boxed{padding-block:var(--indent-medium)}nav.c-nav--boxed ol{padding-left:var(--indent-large);padding-right:calc(var(--indent-large) - var(--link-padding))}}@media (max-width:991px){nav.c-nav--boxed{padding-block:var(--indent-small)}nav.c-nav--boxed ol{padding-left:calc(var(--indent-medium) - var(--link-padding));padding-right:calc(var(--indent-large) - var(--link-padding))}}nav.c-nav--boxed.c-nav--no-list{padding-left:var(--indent-medium);padding-right:var(--indent-large)}nav.c-nav{--space-between-inline-items:0.5em}nav.c-nav a{display:inline-block;padding-inline:var(--link-padding)}nav.c-nav--no-list{display:flex;flex-wrap:wrap}nav.c-nav--no-list>a{margin-right:var(--space-between-inline-items)}@media (max-width:991px){nav.c-nav a{line-height:2.5}nav.c-nav :is(ul,ol){display:flex;flex-wrap:wrap;list-style-position:inside}nav.c-nav :is(ul,ol):not(.c-nav--boxed :is(ul,ol)){padding-left:unset}nav.c-nav :is(ul,ol) li{margin-right:var(--space-between-inline-items)}nav.c-nav ul{list-style-type:none}}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .c-page-list{--item-width:2em;--item-buffer:3px;--item-border:var(--global-border-width--normal)}.c-page-list{display:flex;flex-direction:row;align-items:baseline;list-style:none;font-size:14px}ul.c-page-list{list-style:none}.c-page-link--always-click{position:relative;box-sizing:content-box}.c-page-link--always-click:after,.c-page-link--always-click:before{--width:var(--item-buffer);--vert-offset:calc(var(--item-border)*-1);--horz-offset:calc(100% + var(--item-border));content:"";width:var(--width);position:absolute;top:var(--vert-offset);bottom:var(--vert-offset)}.c-page-link--always-click.c-button{overflow:visible}.c-page-link--always-click:before{right:var(--horz-offset)}.c-page-link--always-click:after{left:var(--horz-offset)}.c-page-item{margin-inline:var(--item-buffer)}.c-page-item:first-child{margin-left:0}.c-page-item:last-child{margin-right:0}.c-page-item--etcetera{min-width:var(--item-width);margin-inline:2px;text-align:center;cursor:default}.c-page-end{padding:4px 12px}.c-page-link{padding:5px 0;min-width:var(--item-width);line-height:1.2}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .c-recognition{font-size:var(--global-font-size--small)}.c-recognition{padding:0 2.14em;overflow:auto}.c-recognition h3{margin-top:.7em}.c-recognition>p:last-child{margin-bottom:1.4em}.c-recognition--style-dark{color:var(--global-color-primary--xx-light);background-color:var(--global-color-primary--xx-dark)}.c-recognition--style-dark a{color:var(--global-color-link-on-dark--normal)}.c-recognition--style-dark h1,.c-recognition--style-dark h2,.c-recognition--style-dark h3,.c-recognition--style-dark h4,.c-recognition--style-dark h5,.c-recognition--style-dark h6{color:var(--global-color-accent--normal)}.c-recognition--style-light{color:var(--global-color-primary--dark);background-color:var(--global-color-primary--xx-light);border-left:0 solid var(--global-color-primary--xx-dark);border-bottom:var(--global-border-width--normal) solid var(--global-color-primary--xx-dark);border-right:0 solid var(--global-color-primary--xx-dark);border-top:var(--global-border-width--normal) solid var(--global-color-primary--xx-dark)}.c-recognition--style-light a{color:var(--global-color-link-on-light--normal)}.c-recognition--style-light h1,.c-recognition--style-light h2,.c-recognition--style-light h3,.c-recognition--style-light h4,.c-recognition--style-light h5,.c-recognition--style-light h6{color:var(--global-color-primary--xx-dark)}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .x-truncate--many-lines{--lines:2;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:var(--lines)}.x-untruncate--many-lines{overflow:visible;-webkit-line-clamp:inherit}.c-see-all-link,.x-truncate--one-line{text-overflow:var(--text-overflow,ellipsis);overflow:hidden;white-space:nowrap}.x-untruncate--one-line{overflow:visible;white-space:normal}.c-see-all-link{display:inline-block;padding-top:1em;padding-right:1em;padding-bottom:1em;margin-bottom:-1em;max-width:100%;font-size:1.2rem;font-weight:var(--bold)}.c-see-all-link__icon{margin-right:.75em;font-size:1.167em;vertical-align:text-bottom;display:inline-block}.c-see-all-link__text{font-size:1em}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ .c-show-more--many-lines .c-show-more__target,.x-truncate--many-lines{--lines:2;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:var(--lines)}.c-show-more--many-lines .c-show-more__state:checked~.c-show-more__target,.x-untruncate--many-lines{overflow:visible;-webkit-line-clamp:inherit}.c-show-more--one-line .c-show-more__target,.x-truncate--one-line{text-overflow:var(--text-overflow,ellipsis);overflow:hidden;white-space:nowrap}.c-show-more--one-line .c-show-more__state:checked~.c-show-more__target,.x-untruncate--one-line{overflow:visible;white-space:normal}.c-show-more__off-text,.c-show-more__on-text,.c-show-more__state{display:none}.c-show-more__state:checked~.c-show-more__toggle .c-show-more__off-text,.c-show-more__state:not(:checked)~.c-show-more__toggle .c-show-more__on-text{display:block}.c-show-more__toggle{cursor:pointer}
@@ -0,0 +1 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ figure>img{margin-bottom:20px}figcaption{color:var(--global-color-primary--dark);font-size:var(--global-font-size--medium);border-top:var(--global-border-width--normal) solid var(--global-color-primary--normal);padding-top:12px}
@@ -0,0 +1,2 @@
1
+ /*! @tacc/core-styles 2.0.0+ | MIT | github.com/TACC/Core-Styles */
2
+ html{font-size:62.5%}body,html{height:100%}body{min-width:290px;color:var(--global-color-primary--x-dark);font-family:var(--global-font-family);font-size:var(--global-font-size--medium);line-height:1.4}main{padding-bottom:var(--global-space--section-gap)}h1,h2,h3,h4,h5,h6{margin-top:revert;font-weight:var(--bold);color:var(--global-color-primary--xx-dark)}h1{font-size:var(--global-font-size--xxx-large)}h2{font-size:var(--global-font-size--xx-large)}h3,h4,h5,h6{margin-bottom:15px}h3{font-size:var(--global-font-size--x-large)}h4{font-size:var(--global-font-size--large)}h4,h5{text-transform:uppercase}h5,h6{font-size:var(--global-font-size--medium)}p{margin-bottom:2rem}dl dl,ol,ul{padding-left:var(--global-space--list-indent)}ol ol,ol ul,ul ol,ul ul{margin:revert}dt{margin-bottom:.5rem;font-weight:400}li{line-height:1.6}hr{margin-block:var(--global-space--hr-margin)}a,a:hover{color:var(--global-color-link-on-light--normal)}a:focus{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}code,kbd,pre,samp,var{font-family:var(--global-font-family--mono)}code kbd{display:inline-block;padding:.1rem .2rem;margin-left:.2rem;margin-right:.2rem;font-size:inherit}code,pre>samp{color:unset}:not(pre)>code{display:inline-block;padding:var(--global-space--xx-small) var(--global-space--x-small)}pre>code,pre>samp{display:inline-block;padding:var(--global-space--x-small) var(--global-space--small)}pre[style]>code,pre[style]>samp{min-width:100%}pre samp{opacity:.75;text-decoration:none}pre code u{opacity:.5;text-decoration:none}table,td,th{border:var(--global-border--normal)}details{margin-top:0;margin-bottom:1rem}