@tacc/core-styles 2.13.0 → 2.15.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 (257) hide show
  1. package/README.md +7 -0
  2. package/dist/branding_logos.css +1 -1
  3. package/dist/components/README.css +1 -1
  4. package/dist/components/admonition/demo.css +1 -1
  5. package/dist/components/admonition.css +1 -1
  6. package/dist/components/align/demo.css +1 -1
  7. package/dist/components/align.css +1 -1
  8. package/dist/components/bootstrap/bootstrap--form.demo.css +1 -1
  9. package/dist/components/bootstrap/bootstrap--modal.demo.css +1 -1
  10. package/dist/components/bootstrap/demo.css +1 -1
  11. package/dist/components/bootstrap.col.css +1 -1
  12. package/dist/components/bootstrap.container.css +1 -1
  13. package/dist/components/bootstrap.css +1 -1
  14. package/dist/components/bootstrap.figure.css +1 -1
  15. package/dist/components/bootstrap.form.css +1 -1
  16. package/dist/components/bootstrap.modal--cms.css +1 -1
  17. package/dist/components/bootstrap.modal--portal.css +1 -1
  18. package/dist/components/bootstrap.modal.css +1 -1
  19. package/dist/components/bootstrap.nav-tabs.css +1 -1
  20. package/dist/components/bootstrap.pagination.css +1 -1
  21. package/dist/components/bootstrap.row.css +1 -1
  22. package/dist/components/c-button/demo.css +1 -1
  23. package/dist/components/c-button.css +1 -1
  24. package/dist/components/c-button.selectors.css +1 -1
  25. package/dist/components/c-callout.css +1 -1
  26. package/dist/components/c-card/c-card--frontera.demo.css +1 -1
  27. package/dist/components/c-card/c-card.demo.css +1 -1
  28. package/dist/components/c-card--docs.css +1 -1
  29. package/dist/components/c-card--from-tup-cms.css +1 -1
  30. package/dist/components/c-card--frontera-about-page.css +1 -1
  31. package/dist/components/c-card.css +1 -1
  32. package/dist/components/c-card.selectors.css +1 -1
  33. package/dist/components/c-data-list.css +1 -1
  34. package/dist/components/c-footer.css +1 -1
  35. package/dist/components/c-form--cms.css +1 -1
  36. package/dist/components/c-form--portal.css +1 -1
  37. package/dist/components/c-form.css +1 -1
  38. package/dist/components/c-form.selectors.css +1 -0
  39. package/dist/components/c-image-map.css +1 -1
  40. package/dist/components/c-image-map.skin.css +1 -1
  41. package/dist/components/c-image-map.structure.css +1 -1
  42. package/dist/components/c-island/demo.css +1 -1
  43. package/dist/components/c-island.css +1 -1
  44. package/dist/components/c-message/demo.css +1 -1
  45. package/dist/components/c-message--compact.css +1 -1
  46. package/dist/components/c-message--expanded.css +1 -1
  47. package/dist/components/c-message.css +1 -1
  48. package/dist/components/c-message.selectors.css +1 -1
  49. package/dist/components/c-nav/demo.css +1 -1
  50. package/dist/components/c-nav.css +1 -1
  51. package/dist/components/c-page.css +1 -1
  52. package/dist/components/c-recognition.css +1 -1
  53. package/dist/components/c-see-all-link.css +1 -1
  54. package/dist/components/c-show-more.css +1 -1
  55. package/dist/components/c-tag/demo.css +1 -1
  56. package/dist/components/c-tag.css +1 -1
  57. package/dist/components/c-tag.selectors.css +1 -1
  58. package/dist/components/cortal.icon.css +1 -1
  59. package/dist/components/cortal.icon.font.css +1 -1
  60. package/dist/components/demo.css +1 -1
  61. package/dist/components/django-cms-forms.css +1 -1
  62. package/dist/components/django-cms-forms.hacks.css +1 -1
  63. package/dist/components/django-cms-forms.selectors.css +1 -0
  64. package/dist/components/mui.tabs.css +1 -1
  65. package/dist/components/pymdownx--tabbed.css +1 -1
  66. package/dist/components/pymdownx.css +1 -1
  67. package/dist/components/tacc-docs.css +1 -1
  68. package/dist/core-styles.base.css +2 -2
  69. package/dist/core-styles.cms.css +2 -2
  70. package/dist/core-styles.demo.css +1 -1
  71. package/dist/core-styles.docs.css +2 -2
  72. package/dist/core-styles.header.css +1 -1
  73. package/dist/core-styles.portal.css +2 -2
  74. package/dist/core-styles.settings.css +1 -1
  75. package/dist/core-styles.theme.default.css +1 -1
  76. package/dist/core-styles.theme.has-dark-logo.css +1 -1
  77. package/dist/core-styles.wysiwyg.css +1 -1
  78. package/dist/elements/README.css +1 -1
  79. package/dist/elements/bootstrap.css +1 -1
  80. package/dist/elements/demo.css +1 -1
  81. package/dist/elements/form.css +1 -0
  82. package/dist/elements/headings/demo.css +1 -1
  83. package/dist/elements/headings--cms.css +1 -1
  84. package/dist/elements/headings--docs.css +1 -1
  85. package/dist/elements/html-elements/demo.css +1 -1
  86. package/dist/elements/html-elements.cms.css +1 -1
  87. package/dist/elements/html-elements.css +1 -1
  88. package/dist/elements/html-elements.docs.css +1 -1
  89. package/dist/elements/links.css +1 -1
  90. package/dist/elements/monospace.css +1 -1
  91. package/dist/elements/root--cms.css +1 -1
  92. package/dist/elements/root--demo.css +1 -1
  93. package/dist/elements/root--docs.css +1 -1
  94. package/dist/elements/root--portal.css +1 -1
  95. package/dist/elements/root.css +1 -1
  96. package/dist/elements/sticky-footer.css +1 -1
  97. package/dist/elements/table--basic.css +1 -1
  98. package/dist/elements/table--nested.css +1 -1
  99. package/dist/elements/table.cms.css +1 -1
  100. package/dist/elements/table.css +1 -1
  101. package/dist/elements/table.docs.css +1 -1
  102. package/dist/elements/table.selectors.css +1 -1
  103. package/dist/elements/tacc-search-bar.css +1 -1
  104. package/dist/fractal.server.refresh.css +1 -1
  105. package/dist/generics/README.css +1 -1
  106. package/dist/generics/fonts.css +1 -1
  107. package/dist/generics/pseudo-elements.css +1 -1
  108. package/dist/objects/README.css +1 -1
  109. package/dist/objects/o-fixed-header-table/demo.css +1 -1
  110. package/dist/objects/o-fixed-header-table.css +1 -1
  111. package/dist/objects/o-flex-item-table-wrap/demo.css +1 -1
  112. package/dist/objects/o-flex-item-table-wrap.css +1 -1
  113. package/dist/objects/o-float-content.css +1 -1
  114. package/dist/objects/o-grid.css +1 -1
  115. package/dist/objects/o-offset-content.css +1 -1
  116. package/dist/objects/o-section/demo.css +1 -1
  117. package/dist/objects/o-section--docs.css +1 -1
  118. package/dist/objects/o-section.css +1 -1
  119. package/dist/objects/o-section.selectors.css +1 -1
  120. package/dist/objects/o-site.css +1 -1
  121. package/dist/objects/o-table-wrap/demo.basic.css +1 -1
  122. package/dist/objects/o-table-wrap/demo.extra.css +1 -1
  123. package/dist/objects/o-table-wrap/example.flexible-horz.css +1 -1
  124. package/dist/objects/o-table-wrap/example.overflow-hidden.css +1 -1
  125. package/dist/objects/o-table-wrap/example.overflow-scroll.css +1 -1
  126. package/dist/objects/o-table-wrap/o-table-wrap--flexible-horz.css +1 -1
  127. package/dist/objects/o-table-wrap/o-table-wrap--flexible-vert.css +1 -1
  128. package/dist/objects/o-table-wrap/o-table-wrap--overflow-hidden.css +1 -1
  129. package/dist/objects/o-table-wrap/o-table-wrap--overflow-scroll-extra.css +1 -1
  130. package/dist/objects/o-table-wrap/o-table-wrap--overflow-scroll.css +1 -1
  131. package/dist/objects/o-table-wrap.css +1 -1
  132. package/dist/settings/README.css +1 -1
  133. package/dist/settings/border.css +1 -1
  134. package/dist/settings/color/demo.css +1 -1
  135. package/dist/settings/color--cms.css +1 -1
  136. package/dist/settings/color--demo.css +1 -1
  137. package/dist/settings/color--docs.css +1 -1
  138. package/dist/settings/color--portal.css +1 -1
  139. package/dist/settings/color.accent--blue.css +1 -1
  140. package/dist/settings/color.accent--purple.css +1 -1
  141. package/dist/settings/color.css +1 -1
  142. package/dist/settings/demo.css +1 -1
  143. package/dist/settings/font/demo-family.css +1 -1
  144. package/dist/settings/font/demo-size.css +1 -1
  145. package/dist/settings/font/demo-style.css +1 -1
  146. package/dist/settings/font/demo-weight.css +1 -1
  147. package/dist/settings/font--cms.css +1 -1
  148. package/dist/settings/font--docs.css +1 -1
  149. package/dist/settings/font--portal.css +1 -1
  150. package/dist/settings/font.css +1 -1
  151. package/dist/settings/max-width.css +1 -1
  152. package/dist/settings/space.css +1 -1
  153. package/dist/tools/README.css +1 -1
  154. package/dist/tools/c-form.selectors.css +1 -0
  155. package/dist/tools/media-queries.css +1 -1
  156. package/dist/tools/s-form.css +1 -0
  157. package/dist/tools/selectors.common.css +1 -1
  158. package/dist/tools/selectors.css +1 -1
  159. package/dist/tools/selectors.form.css +1 -0
  160. package/dist/tools/selectors.monospace.css +1 -1
  161. package/dist/tools/x-article-link.css +1 -1
  162. package/dist/tools/x-blockquote.css +1 -1
  163. package/dist/tools/x-center.css +1 -1
  164. package/dist/tools/x-fake-border.css +1 -1
  165. package/dist/tools/x-figure.css +1 -1
  166. package/dist/tools/x-grid.css +1 -1
  167. package/dist/tools/x-layout.css +1 -1
  168. package/dist/tools/x-link.css +1 -1
  169. package/dist/tools/x-mailto-text-replace.css +1 -1
  170. package/dist/tools/x-overlay.css +1 -1
  171. package/dist/tools/x-tabs/demo.css +1 -1
  172. package/dist/tools/x-tabs.css +1 -1
  173. package/dist/tools/x-tabs.skin.css +1 -1
  174. package/dist/tools/x-tabs.structure.css +1 -1
  175. package/dist/tools/x-truncate.css +1 -1
  176. package/dist/trumps/README.css +1 -1
  177. package/dist/trumps/demo.css +1 -1
  178. package/dist/trumps/s-affixed-input-wrapper/demo.css +1 -0
  179. package/dist/trumps/s-affixed-input-wrapper.css +1 -1
  180. package/dist/trumps/s-article-list.css +1 -1
  181. package/dist/trumps/s-article-preview.css +1 -1
  182. package/dist/trumps/s-blockquote.css +1 -1
  183. package/dist/trumps/s-breadcrumbs.css +1 -1
  184. package/dist/trumps/s-cms-nav.css +1 -1
  185. package/dist/trumps/s-document.css +1 -1
  186. package/dist/trumps/s-footer.css +1 -1
  187. package/dist/trumps/s-form--cms.css +1 -0
  188. package/dist/trumps/s-form--portal.css +1 -0
  189. package/dist/trumps/s-form.css +1 -0
  190. package/dist/trumps/s-form.selectors.css +1 -0
  191. package/dist/trumps/s-guide-doc.css +1 -1
  192. package/dist/trumps/s-header.bootstrap.css +1 -1
  193. package/dist/trumps/s-header.css +1 -1
  194. package/dist/trumps/s-image-grid.css +1 -1
  195. package/dist/trumps/s-inline-dl.css +1 -1
  196. package/dist/trumps/s-irregular-links.css +1 -1
  197. package/dist/trumps/s-paragraph-table.css +1 -1
  198. package/dist/trumps/s-portal-nav.css +1 -1
  199. package/dist/trumps/s-style-guide.css +1 -1
  200. package/dist/trumps/s-system-specs.css +1 -1
  201. package/dist/trumps/tacc-search-bar.css +1 -1
  202. package/dist/trumps/u-empty.css +1 -1
  203. package/dist/trumps/u-hide.css +1 -1
  204. package/dist/trumps/u-mailto-text-replace.css +1 -1
  205. package/dist/trumps/u-nested-text-content.css +1 -1
  206. package/docs/bootstrap.md +52 -0
  207. package/docs/contributing.config.yml +1 -0
  208. package/docs/contributing.md +4 -2
  209. package/docs/shortcuts/forms.md +11 -0
  210. package/docs/shortcuts/tables.md +5 -3
  211. package/package.json +1 -1
  212. package/src/lib/_imports/_partials/field-errors.hbs +1 -0
  213. package/src/lib/_imports/_partials/form-errors.hbs +12 -0
  214. package/src/lib/_imports/_partials/form.hbs +431 -0
  215. package/src/lib/_imports/_partials/link-list.hbs +19 -9
  216. package/src/lib/_imports/components/c-button.css +4 -4
  217. package/src/lib/_imports/components/c-form/c-form.hbs +1 -366
  218. package/src/lib/_imports/components/c-form/config.yml +19 -5
  219. package/src/lib/_imports/components/c-form/readme.md +1 -7
  220. package/src/lib/_imports/components/c-form/toggle-required-fields.js +35 -19
  221. package/src/lib/_imports/components/c-form--cms.css +3 -2
  222. package/src/lib/_imports/components/c-form--portal.css +3 -2
  223. package/src/lib/_imports/components/c-form.css +53 -57
  224. package/src/lib/_imports/components/c-form.selectors.css +37 -0
  225. package/src/lib/_imports/components/c-nav/config.yml +3 -0
  226. package/src/lib/_imports/components/django-cms-forms/config.yml +35 -3
  227. package/src/lib/_imports/components/django-cms-forms/django-cms-forms.hbs +1 -408
  228. package/src/lib/_imports/components/django-cms-forms.css +12 -168
  229. package/src/lib/_imports/components/django-cms-forms.selectors.css +37 -0
  230. package/src/lib/_imports/components/pymdownx--tabbed.css +1 -1
  231. package/src/lib/_imports/core-styles.base.css +3 -0
  232. package/src/lib/_imports/core-styles.cms.css +0 -2
  233. package/src/lib/_imports/core-styles.docs.css +0 -1
  234. package/src/lib/_imports/elements/{form.cms.css → form.css} +11 -3
  235. package/src/lib/_imports/elements/html-elements.cms.css +3 -0
  236. package/src/lib/_imports/elements/html-elements.css +1 -1
  237. package/src/lib/_imports/tools/selectors.form.css +71 -0
  238. package/src/lib/_imports/trumps/s-affixed-input-wrapper/README.md +4 -2
  239. package/src/lib/_imports/trumps/s-affixed-input-wrapper/_s-affixed-input-wrapper--affix.hbs +15 -0
  240. package/src/lib/_imports/trumps/s-affixed-input-wrapper/_s-affixed-input-wrapper--end.hbs +13 -0
  241. package/src/lib/_imports/trumps/s-affixed-input-wrapper/config.yml +9 -1
  242. package/src/lib/_imports/trumps/s-affixed-input-wrapper/demo.css +5 -0
  243. package/src/lib/_imports/trumps/s-affixed-input-wrapper/s-affixed-input-wrapper--prefix-and-suffix.hbs +32 -0
  244. package/src/lib/_imports/trumps/s-affixed-input-wrapper/s-affixed-input-wrapper--prepend-and-append.hbs +43 -0
  245. package/src/lib/_imports/trumps/s-affixed-input-wrapper/s-affixed-input-wrapper.hbs +1 -32
  246. package/src/lib/_imports/trumps/s-affixed-input-wrapper.css +108 -47
  247. package/src/lib/_imports/trumps/s-form/config.yml +23 -0
  248. package/src/lib/_imports/trumps/s-form/readme.md +8 -0
  249. package/src/lib/_imports/trumps/s-form/s-form.hbs +1 -0
  250. package/src/lib/_imports/trumps/s-form--cms.css +1 -0
  251. package/src/lib/_imports/trumps/s-form--portal.css +1 -0
  252. package/src/lib/_imports/trumps/s-form.css +2 -0
  253. package/src/lib/_imports/trumps/s-form.selectors.css +38 -0
  254. package/dist/components/django-cms-forms--errors-via-c-message.css +0 -1
  255. package/dist/elements/form.cms.css +0 -1
  256. package/src/lib/_imports/components/django-cms-forms--errors-via-c-message.css +0 -23
  257. /package/docs/{index.md → 01-index.md} +0 -0
@@ -17,17 +17,25 @@ label {
17
17
  font-weight: var(--medium);
18
18
 
19
19
  line-height: normal;
20
- margin-bottom: 0.75em;
21
20
  }
22
21
  /* To avoid extra space between field wrappers */
23
22
  /* FAQ: The known use case is a django.cms.forms `.checkboxselectmultiple` */
24
23
  li > label:only-child {
25
24
  margin-bottom: unset;
26
25
  }
27
- /* To avoid inline labels for raw form elements */
26
+ /* To avoid inline labels for (most) raw form elements */
28
27
  /* FAQ: Any specific form styling (e.g. django.cms.forms) manages this */
29
- :not(input[type="checkbox"]) + label {
28
+ label:not(
29
+ input[type="checkbox"] + *, /* so checkbox labels are still inline */
30
+ :is(ul, menu) * /* so menus of radios or checkboxes are still inline */
31
+ ) {
30
32
  display: block;
33
+ margin-bottom: 0.75em;
34
+ }
35
+ /* To avoid extra space between label and list of inputs */
36
+ label + :is(ul, menu),
37
+ .checkboxinput .errorlist /* django-cms-forms */ {
38
+ margin-top: unset;
31
39
  }
32
40
 
33
41
 
@@ -1,4 +1,5 @@
1
1
  @import url("../tools/selectors.css");
2
+ @import url("../tools/selectors.form.css");
2
3
 
3
4
  /* To scope these styles to main content (i.e. not header, not navbar) */
4
5
  :where(:--main-content) {
@@ -56,6 +57,8 @@ Styleguide Elements.TextContent
56
57
  & :is(
57
58
  ol, ul,
58
59
  dl dl /* Treat nested definition lists like other nested lists */
60
+ ):not(
61
+ :--form *
59
62
  ) {
60
63
  padding-left: var(--global-space--list-indent);
61
64
  }
@@ -59,7 +59,7 @@ Styleguide Elements.TextContent
59
59
  }
60
60
 
61
61
  /* To mimic Bootstrap */
62
- & :is(dl, ol, ul) {
62
+ & :is(dl, ol, ul, menu) {
63
63
  margin-top: 0;
64
64
  margin-bottom: 1rem;
65
65
  }
@@ -0,0 +1,71 @@
1
+ @import url("../components/c-form.selectors.css");
2
+ @import url("../components/django-cms-forms.selectors.css");
3
+ @import url("../trumps/s-form.selectors.css");
4
+
5
+ @custom-selector :--form
6
+ :--c-form,
7
+ :--s-form,
8
+ :--cms-form;
9
+
10
+ @custom-selector :--form__title
11
+ :--c-form__title,
12
+ :--s-form__title,
13
+ :--cms-form__title;
14
+ @custom-selector :--form__desc
15
+ :--c-form__desc,
16
+ :--s-form__desc,
17
+ :--cms-form__desc;
18
+
19
+ @custom-selector :--form__errors /* errors container (maybe not the list) */
20
+ :--c-form__errors,
21
+ :--s-form__errors,
22
+ :--cms-form__errors;
23
+ @custom-selector :--form__errors_list /* list of errors (maybe not container) */
24
+ :--c-form__errors_list,
25
+ :--s-form__errors_list,
26
+ :--cms-form__errors_list;
27
+ @custom-selector :--form__errors--form /* submission errors */
28
+ :--c-form__errors--form,
29
+ :--s-form__errors--form,
30
+ :--cms-form__errors--form;
31
+ @custom-selector :--form__errors--field /* validation errors */
32
+ :--c-form__errors--field,
33
+ :--s-form__errors--field,
34
+ :--cms-form__errors--field;
35
+
36
+ @custom-selector :--form__field
37
+ :--c-form__field,
38
+ :--s-form__field,
39
+ :--cms-form__field;
40
+ @custom-selector :--form__field--has-required
41
+ :--c-form__field--has-required,
42
+ :--s-form__field--has-required,
43
+ :--cms-form__field--has-required;
44
+ @custom-selector :--form__field--has-checkbox
45
+ :--c-form__field--has-checkbox,
46
+ :--s-form__field--has-checkbox,
47
+ :--cms-form__field--has-checkbox;
48
+
49
+ @custom-selector :--form__menu
50
+ :--c-form__menu,
51
+ :--s-form__menu,
52
+ :--cms-form__menu;
53
+
54
+ @custom-selector :--form__help
55
+ :--c-form__help,
56
+ :--s-form__help,
57
+ :--cms-form__help;
58
+
59
+ @custom-selector :--form__badge
60
+ :--c-form__badge,
61
+ :--s-form__badge,
62
+ :--cms-form__badge;
63
+
64
+ @custom-selector :--form__buttons
65
+ :--c-form__buttons,
66
+ :--s-form__buttons,
67
+ :--cms-form__buttons;
68
+ @custom-selector :--form__button
69
+ :--c-form__button,
70
+ :--s-form__button,
71
+ :--cms-form__button;
@@ -5,11 +5,13 @@ _This is an isolated feature from [Bootstrap Input Group](https://getbootstrap.c
5
5
  **Use Cases**
6
6
 
7
7
  - [APCD](https://apcd-qa.tacc.utexas.edu/register/request-to-submit) "Total Claims Value"
8
+ - [Core Portal](https://github.com/TACC/Core-Portal) to replace [Bootstrap `.input-group`](https://getbootstrap.com/docs/4.0/components/input-group/)*
9
+
10
+ <small>* Bootstrap `.input-group` requires extra markup, which can make it cumbersome to combine React JSX components without the components having "external knowledge".</small>
8
11
 
9
12
  **Known Bugs**
10
13
 
11
- 1. Using `s-affixed-input-wrapper__suffix` shrinks field width.
12
- 2. A `s-affixed-input-wrapper__suffix` overlaps with browser controls e.g.
14
+ 1. A `s-affixed-input-wrapper__suffix` overlaps with browser controls e.g.
13
15
  - `<input type="number">` arrows
14
16
  - `<input type="date">` calendar
15
17
  - `<input type="time">` clock
@@ -0,0 +1,15 @@
1
+ <div class="
2
+ s-affixed-input-wrapper s-affixed-input-wrapper--{{modifier}}
3
+ {{#if is-full-width}}s-affixed-input-wrapper--full-width{{/if}}
4
+ ">
5
+ <label for="field-dollars">How many dollars do you have?</label>
6
+ <span class="s-affixed-input-wrapper__{{modifier}}">$</span>
7
+ <input
8
+ type="number"
9
+ name="dollars"
10
+ id="field-dollars"
11
+ inputmode="numeric"
12
+ step="0.01"
13
+ min="0.01"
14
+ />
15
+ </div>
@@ -0,0 +1,13 @@
1
+ <div class="
2
+ s-affixed-input-wrapper s-affixed-input-wrapper--{{modifier}}
3
+ {{#if is-full-width}}s-affixed-input-wrapper--full-width{{/if}}
4
+ ">
5
+ <label for="text-to-copy-{{modifier}}">Text to Copy</label>
6
+ <button
7
+ class="s-affixed-input-wrapper__{{modifier}} c-button c-button--size-small"
8
+ data-copy-target="text-to-copy-{{modifier}}"
9
+ >
10
+ Copy
11
+ </button>
12
+ <input id="text-to-copy-{{modifier}}" name="text-{{modifier}}" />
13
+ </div>
@@ -1,4 +1,12 @@
1
- label: (CMS) S Affixed Input Wrapper
2
1
  context:
3
2
  shouldLoadCMS: true
4
3
  📝 shouldLoadBootstrap: temporary dependence, until proven to work on Portal
4
+ variants:
5
+ - name: default
6
+ hidden: true
7
+ - name: prefix-and-suffix
8
+ label: Prefix & Suffix
9
+ status: wip
10
+ - name: prepend-and-append
11
+ label: Prepend & Append
12
+ status: prototype
@@ -0,0 +1,5 @@
1
+ /* This CSS is ONLY for the pattern library. It is NOT part of the pattern. */
2
+
3
+ .demo-static-width input {
4
+ width: 25ch;
5
+ }
@@ -0,0 +1,32 @@
1
+ <dl>
2
+ <dt>Prefix</dt>
3
+ <dl>
4
+ <dt>Auto-Width Input</dt>
5
+ <dd>
6
+ {{> @s-affixed-input-wrapper--affix modifier="prefix" }}
7
+ </dd>
8
+ <dt>Static-Width Input</dt>
9
+ <dd class="demo-static-width">
10
+ {{> @s-affixed-input-wrapper--affix modifier="prefix" }}
11
+ </dd>
12
+ <dt>Full-Width Input</dt>
13
+ <dd>
14
+ {{> @s-affixed-input-wrapper--affix modifier="prefix" is-full-width=true }}
15
+ </dd>
16
+ </dl>
17
+ <dt>Suffix</dt>
18
+ <dl>
19
+ <dt>Auto-Width Input</dt>
20
+ <dd>
21
+ {{> @s-affixed-input-wrapper--affix modifier="suffix" }}
22
+ </dd>
23
+ <dt>Static-Width Input</dt>
24
+ <dd class="demo-static-width">
25
+ {{> @s-affixed-input-wrapper--affix modifier="suffix" }}
26
+ </dd>
27
+ <dt>Full-Width Input</dt>
28
+ <dd>
29
+ {{> @s-affixed-input-wrapper--affix modifier="suffix" is-full-width=true }}
30
+ </dd>
31
+ </dl>
32
+ </dl>
@@ -0,0 +1,43 @@
1
+ <dl>
2
+ <dt>Prepend</dt>
3
+ <dl>
4
+ <dt>Auto-Width Input</dt>
5
+ <dd>
6
+ {{> @s-affixed-input-wrapper--end modifier="prepend" }}
7
+ </dd>
8
+ <dt>Static-Width Input</dt>
9
+ <dd class="demo-static-width">
10
+ {{> @s-affixed-input-wrapper--end modifier="prepend" }}
11
+ </dd>
12
+ <dt>Full-Width Input</dt>
13
+ <dd>
14
+ {{> @s-affixed-input-wrapper--end modifier="prepend" is-full-width=true }}
15
+ </dd>
16
+ </dl>
17
+ <dt>Append</dt>
18
+ <dl>
19
+ <dt>Auto-Width Input</dt>
20
+ <dd>
21
+ {{> @s-affixed-input-wrapper--end modifier="append" }}
22
+ </dd>
23
+ <dt>Static-Width Input</dt>
24
+ <dd class="demo-static-width">
25
+ {{> @s-affixed-input-wrapper--end modifier="append" }}
26
+ </dd>
27
+ <dt>Full-Width Input</dt>
28
+ <dd>
29
+ {{> @s-affixed-input-wrapper--end modifier="append" is-full-width=true }}
30
+ </dd>
31
+ </dl>
32
+ </dl>
33
+ <script>
34
+ const copyButtons = document.querySelectorAll('[data-copy-target]');
35
+
36
+ [ ...copyButtons ].forEach( button => button.addEventListener('click', event => {
37
+ const textFieldId = event.srcElement.dataset.copyTarget
38
+ const textField = document.getElementById( textFieldId );
39
+ const text = textField.value;
40
+
41
+ navigator.clipboard.writeText( text );
42
+ }));
43
+ </script>
@@ -1,32 +1 @@
1
- <dl>
2
- <dt>Prefix</dt>
3
- <dd>
4
- <div class="s-affixed-input-wrapper s-affixed-input-wrapper--prefix">
5
- <label for="field-dollars">How many dollars to you have?</label>
6
- <span class="s-affixed-input-wrapper__prefix">$</span>
7
- <input
8
- type="number"
9
- name="dollars"
10
- id="field-dollars"
11
- inputmode="numeric"
12
- step="0.01"
13
- min="0.01"
14
- />
15
- </div>
16
- </dd>
17
- <dt>Suffix</dt>
18
- <dd>
19
- <div class="s-affixed-input-wrapper s-affixed-input-wrapper--suffix">
20
- <label for="field-usd">How many US Dollars to you have?</label>
21
- <input
22
- type="number"
23
- name="usd"
24
- id="field-usd"
25
- inputmode="numeric"
26
- step="0.01"
27
- min="0.01"
28
- />
29
- <span class="s-affixed-input-wrapper__suffix">$</span>
30
- </div>
31
- </dd>
32
- </dl>
1
+ <!-- SEE: s-affixed-input-wrapper--… -->
@@ -1,60 +1,127 @@
1
- /* Layout */
1
+ @import url("../tools/selectors.form.css");
2
2
 
3
- .s-affixed-input-wrapper:not(
3
+ /* Grid */
4
+
5
+ .s-affixed-input-wrapper:where(:not(
4
6
  .checkboxinput, .has-type-check
5
7
  .radio, .has-type-radio
6
8
  .select, .has-type-select
7
9
  .checkboxselectmultiple, .has-select
8
10
  .textarea, .has-textarea
9
- ) {
11
+ )) {
10
12
  display: grid;
11
- align-items: start;
12
- grid-template-columns: auto 1fr;
13
+ }
14
+
15
+ /* Grid: Cells */
16
+
17
+ .s-affixed-input-wrapper label { grid-area: label; }
18
+ .s-affixed-input-wrapper input { grid-area: input; }
19
+ .s-affixed-input-wrapper .help-text /* for Django CMS */,
20
+ .s-affixed-input-wrapper :--form__help { grid-area: help; }
21
+ .s-affixed-input-wrapper .field-errors /* for Django CMS */,
22
+ .s-affixed-input-wrapper :--form__errors { grid-area: error; }
23
+
24
+ /* To render element atop input */
25
+ .s-affixed-input-wrapper__prepend,
26
+ .s-affixed-input-wrapper__append,
27
+ .s-affixed-input-wrapper__prefix,
28
+ .s-affixed-input-wrapper__suffix {
29
+ position: relative;
30
+ }
31
+
32
+ /* Grid: Prepend & Append */
33
+
34
+ /* To layout prefix and suffix beside input */
35
+ .s-affixed-input-wrapper--prepend,
36
+ .s-affixed-input-wrapper--append {
37
+ grid-template-areas:
38
+ "label label label"
39
+ var(--input-area)
40
+ "help help help"
41
+ "error error error";
42
+ }
43
+ .s-affixed-input-wrapper__prepend { grid-area: prepend; }
44
+ .s-affixed-input-wrapper__append { grid-area: append; }
45
+ .s-affixed-input-wrapper--append { --input-area: "input append _____"; }
46
+ .s-affixed-input-wrapper--prepend { --input-area: "prepend input _____"; }
47
+
48
+ /* To shrink input area to match input width */
49
+ .s-affixed-input-wrapper--prepend:where(:not([class*="--full-width"])) {
50
+ grid-template-columns: auto auto 1fr; /* to stretch empty space right of input */
51
+ }
52
+ .s-affixed-input-wrapper--append:where(:not([class*="--full-width"])) {
53
+ grid-template-columns: auto auto 1fr; /* to stretch empty space right of input */
54
+ }
55
+
56
+ /* To stretch input to full width */
57
+ .s-affixed-input-wrapper--prepend.s-affixed-input-wrapper--full-width {
58
+ grid-template-columns: auto 1fr auto; /* to shrink empty space right of input */
59
+ }
60
+ .s-affixed-input-wrapper--append.s-affixed-input-wrapper--full-width {
61
+ grid-template-columns: 1fr auto auto; /* to shrink empty space right of input */
62
+ }
63
+
64
+ /* Grid: Prefix & Suffix */
65
+
66
+ /* To layout prefix and suffix within input (and before an empty cell) */
67
+ /* FAQ: Empty cell adjusts, or is adjusted to, the width of input field */
68
+ .s-affixed-input-wrapper--prefix,
69
+ .s-affixed-input-wrapper--suffix {
13
70
  grid-template-areas:
14
71
  "label label"
15
- var(--input-row, "input input")
72
+ "input _____"
16
73
  "help help"
17
74
  "error error";
18
75
  }
19
- @supports selector(:has(*)) {
20
- .s-affixed-input-wrapper:has(.s-affixed-input-wrapper__prefix) {
21
- --input-row: "prefix input";
22
- }
23
- .s-affixed-input-wrapper:has(.s-affixed-input-wrapper__suffix) {
24
- --input-row: "input suffix";
25
- }
26
- }
27
- @supports not selector(:has(*)) {
28
- .s-affixed-input-wrapper--prefix {
29
- --input-row: "prefix input";
30
- }
31
- .s-affixed-input-wrapper--suffix {
32
- --input-row: "input suffix";
33
- }
76
+ .s-affixed-input-wrapper__prefix,
77
+ .s-affixed-input-wrapper__suffix {
78
+ grid-area: input;
34
79
  }
35
- .s-affixed-input-wrapper label { grid-area: label; }
36
- .s-affixed-input-wrapper input { grid-area: input; }
37
- .s-affixed-input-wrapper__prefix { grid-area: prefix; }
38
- .s-affixed-input-wrapper__suffix { grid-area: suffix; }
39
- .s-affixed-input-wrapper .help-text,
40
- .s-affixed-input-wrapper .c-form__help { grid-area: help; }
41
- .s-affixed-input-wrapper .field-errors,
42
- .s-affixed-input-wrapper .c-form__errors { grid-area: error; }
43
80
 
81
+ /* To shrink input area to match input width */
82
+ .s-affixed-input-wrapper--prefix:where(:not([class*="--full-width"])),
83
+ .s-affixed-input-wrapper--suffix:where(:not([class*="--full-width"])) {
84
+ grid-template-columns: auto 1fr; /* to stretch empty space right of input */
85
+ }
44
86
 
87
+ /* To stretch input to full width */
88
+ .s-affixed-input-wrapper--prefix.s-affixed-input-wrapper--full-width,
89
+ .s-affixed-input-wrapper--suffix.s-affixed-input-wrapper--full-width {
90
+ grid-template-columns: 1fr auto; /* to shrink empty space right of input */
91
+ }
45
92
 
46
- /* Variables */
93
+ /* To position prefix and suffix */
94
+ /* FAQ: Prefix has `justify-self: start` by default, but to see it is clearer */
95
+ .s-affixed-input-wrapper__prefix { justify-self: start; }
96
+ .s-affixed-input-wrapper__suffix { justify-self: end; }
47
97
 
48
- .s-affixed-input-wrapper {
49
- --width: 1em;
50
- --padding-vert: 5px; /* mimic input */
51
- --padding-horz: 10px; /* mimic input */
98
+
99
+
100
+ /* Prepnd & Append */
101
+
102
+ .s-affixed-input-wrapper__prepend,
103
+ .s-affixed-input-wrapper__append {
104
+ /* To make this element's border visible, not the input */
105
+ position: relative; /* FAQ: auto z-index bump moves element atop field */
106
+ }
107
+ .s-affixed-input-wrapper__prepend {
108
+ margin-right: calc( -1 * var(--global-border-width--normal) );
109
+ }
110
+ .s-affixed-input-wrapper__append {
111
+ margin-left: calc( -1 * var(--global-border-width--normal) );
52
112
  }
53
113
 
54
114
 
55
115
 
56
116
  /* Prefix & Suffix */
57
117
 
118
+ .s-affixed-input-wrapper--prefix,
119
+ .s-affixed-input-wrapper--suffix {
120
+ --width: 1em;
121
+ --padding-vert: 5px; /* mimic input */
122
+ --padding-horz: 10px; /* mimic input */
123
+ }
124
+
58
125
  .s-affixed-input-wrapper__prefix,
59
126
  .s-affixed-input-wrapper__suffix {
60
127
  /* To mimic shape of an input */
@@ -74,19 +141,13 @@
74
141
  font-family: var(--global-font-family--sans--portal);
75
142
  }
76
143
 
77
- /* To render <span> atop and (as if) within input */
78
- .s-affixed-input-wrapper__prefix {
79
- position: relative;
80
- top: var(--global-border-width--normal);
81
- left: var(--global-border-width--normal);
82
- margin-right: calc(-1 * var(--width) - var(--padding-horz) * 2);
83
- }
84
- .s-affixed-input-wrapper__suffix {
85
- position: relative;
86
- top: var(--global-border-width--normal);
87
- right: var(--global-border-width--normal);
88
- margin-left: calc(-1 * var(--width) - var(--padding-horz) * 2);
89
- }
90
144
  .s-affixed-input-wrapper__prefix + input {
91
145
  text-indent: calc(var(--width) + var(--padding-horz));
92
146
  }
147
+
148
+ /* To NOT stretch input to match width of wider label */
149
+ /* FAQ: Using `:where()` to reduce specificity */
150
+ .s-affixed-input-wrapper--prefix:where(:not([class*="--full-width"])) input,
151
+ .s-affixed-input-wrapper--suffix:where(:not([class*="--full-width"])) input {
152
+ width: fit-content;
153
+ }
@@ -0,0 +1,23 @@
1
+ context:
2
+ helpTextTag: small
3
+ inputListTag: menu
4
+ selectors:
5
+ errorList: :where(.s-form > ul), :where(.s-form > div > ul)
6
+ wrap: :where(.s-form > div)
7
+ classNames:
8
+ root: s-form
9
+ has_required: has-required
10
+ has_checkbox: has-type-check
11
+ has_spam_filter: has-spam-check
12
+ variants:
13
+ - name: default
14
+ status: wip
15
+ - name: portal
16
+ status: wip
17
+ context:
18
+ shouldLoadPortal: true
19
+ - name: cms
20
+ label: CMS
21
+ status: wip
22
+ context:
23
+ shouldLoadCMS: true
@@ -0,0 +1,8 @@
1
+ To style when mostly raw [Form elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element#table_content) are sufficient.
2
+
3
+ <script>
4
+ /* To open external links in new window */
5
+ Array.from(document.links)
6
+ .filter(link => link.hostname != window.location.hostname)
7
+ .forEach(link => link.target = '_blank');
8
+ </script>
@@ -0,0 +1 @@
1
+ {{> @form class=classNames selectors=selectors message=message }}
@@ -0,0 +1 @@
1
+ @import url("../components/c-form--cms.css");
@@ -0,0 +1 @@
1
+ @import url("../components/c-form--portal.css");
@@ -0,0 +1,2 @@
1
+ /* FAQ: c-form.css styles s-form and django-cms-forms */
2
+ @import url("../components/c-form.css");
@@ -0,0 +1,38 @@
1
+ @custom-selector :--s-form
2
+ .s-form;
3
+
4
+ @custom-selector :--s-form__desc
5
+ :where(.s-form > :is(h1, h2, h3, h4, h5, h6) + p);
6
+ @custom-selector :--s-form__title
7
+ :where(.s-form > :is(h1, h2, h3, h4, h5, h6));
8
+
9
+ @custom-selector :--s-form__errors
10
+ :where(:--s-form__errors--form, :--s-form__errors--field);
11
+ @custom-selector :--s-form__errors_list
12
+ :--s-form__errors;
13
+ @custom-selector :--s-form__errors--form /* submission errors */
14
+ :where(.s-form > ul);
15
+ @custom-selector :--s-form__errors--field /* validation errors */
16
+ :where(.s-form > div > ul);
17
+
18
+ @custom-selector :--s-form__field
19
+ :where(.s-form > div);
20
+ @custom-selector :--s-form__field--has-required
21
+ :where(.s-form > div).has-required;
22
+ @custom-selector :--s-form__field--has-checkbox
23
+ :--s-form__field.has-type-check;
24
+
25
+ @custom-selector :--s-form__menu
26
+ :where(.s-form > div > menu);
27
+
28
+ @custom-selector :--s-form__help
29
+ :where(.s-form > div > small);
30
+
31
+ @custom-selector :--s-form__badge
32
+ :where(.s-form label > span);
33
+
34
+ @custom-selector :--s-form__buttons
35
+ :where(.s-form > footer);
36
+
37
+ @custom-selector :--s-form__button
38
+ :where(.s-form button);
@@ -1 +0,0 @@
1
- /*! @tacc/core-styles 2.13.0+ | MIT | github.com/TACC/Core-Styles */.c-message>:first-child,.field-errors li>:first-child,.form-errors>:first-child,[class*=message--]>:first-child{margin-top:0}.c-message>:last-child,.field-errors li>:last-child,.form-errors>:last-child,[class*=message--]>:last-child{margin-bottom:0}.field-errors li,.form-errors,[class*=message--scope-]{padding:var(--pad-vert,0) var(--pad-horz,0)}.c-message--scope-global,.message--scope-global{--pad-vert:15px;--pad-horz:20px;border-width:var(--global-border-width--thick);text-align:center}.c-message--type-info.c-message--scope-section,.c-message--type-info.message--scope-section,.message--type-info.c-message--scope-section,.message--type-info.message--scope-section{background-color:var(--global-color-info--x-light);border-color:var(--global-color-info--normal)}.c-message--type-success.c-message--scope-section,.c-message--type-success.message--scope-section,.message--type-success.c-message--scope-section,.message--type-success.message--scope-section{background-color:var(--global-color-success--x-light);border-color:var(--global-color-success--normal)}.c-message--type-warning.c-message--scope-section,.c-message--type-warning.message--scope-section,.message--type-warning.c-message--scope-section,.message--type-warning.message--scope-section{background-color:var(--global-color-warning--x-light);border-color:var(--global-color-warning--normal)}.c-message--type-error.c-message--scope-section,.c-message--type-error.message--scope-section,.field-errors li.c-message--scope-section,.field-errors li.message--scope-section,.form-errors,.form-errors.c-message--scope-section,.form-errors.message--scope-section,.message--type-error.c-message--scope-section,.message--type-error.message--scope-section{background-color:var(--global-color-danger--x-light);border-color:var(--global-color-danger--normal)}:--c-message--type-tip.c-message--scope-section,:--c-message--type-tip.message--scope-section{background-color:var(--global-color-extra--x-light);border-color:var(--global-color-extra--normal)}.c-message--scope-global,.message--scope-global{background-color:var(--global-color-accent--secondary);border-color:var(--global-color-primary--dark);color:var(--global-color-primary--xx-light)}.c-message--scope-global [class*=button--as-link],.c-message--scope-global a,.message--scope-global [class*=button--as-link],.message--scope-global a,.x-link,.x-link--irregular{color:var(--global-color-accent--normal);text-decoration:none;text-decoration-thickness:var(--global-border-width--normal);text-underline-offset:.2em}.x-link--disabled,.x-link--irregular--disabled{opacity:.5;pointer-events:none}.c-message--scope-global [class*=button--as-link]:hover,.c-message--scope-global a:hover,.message--scope-global [class*=button--as-link]:hover,.message--scope-global a:hover,.x-link--hover,.x-link--irregular--hover{color:var(--global-color-accent--normal);text-decoration-line:underline;text-decoration-style:solid;text-decoration-thickness:var(--global-border-width--normal)}.c-message--scope-global [class*=button--as-link]:active,.c-message--scope-global a:active,.message--scope-global [class*=button--as-link]:active,.message--scope-global a:active,.x-link--active,.x-link--irregular--active{text-decoration-line:underline;text-decoration-style:dotted}.c-message--scope-global [class*=button--as-link],.c-message--scope-global a,.message--scope-global [class*=button--as-link],.message--scope-global a,.x-link--irregular{text-decoration-line:underline}.c-message--scope-global [class*=button--as-link]:hover,.c-message--scope-global a:hover,.message--scope-global [class*=button--as-link]:hover,.message--scope-global a:hover,.x-link--irregular--hover{text-decoration-style:dashed}.c-message--scope-global [class*=button--as-link]:active,.c-message--scope-global a:active,.message--scope-global [class*=button--as-link]:active,.message--scope-global a:active,.x-link--irregular--active{text-decoration-style:dotted}.c-message--scope-global [class*=button--as-link],.c-message--scope-global a,.message--scope-global [class*=button--as-link],.message--scope-global a{color:inherit!important}.c-message--scope-section,.form-errors,.message--scope-section{--pad-vert:20px;--pad-horz:30px;border-style:solid;border-width:var(--global-border-width--normal)}.c-message--scope-section,.form-errors,.message--scope-section{color:var(--global-color-primary--dark)}.c-message--type-info.c-message--scope-inline,.c-message--type-info.message--scope-inline,.message--type-info.c-message--scope-inline,.message--type-info.message--scope-inline{color:var(--global-color-info--x-dark)}.c-message--type-success.c-message--scope-inline,.c-message--type-success.message--scope-inline,.message--type-success.c-message--scope-inline,.message--type-success.message--scope-inline{color:var(--global-color-success--x-dark)}.c-message--type-warning.c-message--scope-inline,.c-message--type-warning.message--scope-inline,.message--type-warning.c-message--scope-inline,.message--type-warning.message--scope-inline{color:var(--global-color-warning--x-dark)}.c-message--type-error.c-message--scope-inline,.c-message--type-error.message--scope-inline,.field-errors li,.field-errors li.c-message--scope-inline,.field-errors li.message--scope-inline,.form-errors.c-message--scope-inline,.form-errors.message--scope-inline,.message--type-error.c-message--scope-inline,.message--type-error.message--scope-inline{color:var(--global-color-danger--x-dark)}:--c-message--type-tip.c-message--scope-inline,:--c-message--type-tip.message--scope-inline{color:var(--global-color-extra--x-dark)}.c-message--type-info:before,.message--type-info:before{background-color:var(--global-color-info--normal)}.c-message--type-success:before,.message--type-success:before{background-color:var(--global-color-success--normal)}.c-message--type-warning:before,.message--type-warning:before{background-color:var(--global-color-warning--normal)}.c-message--type-error:before,.field-errors li:before,.form-errors:before,.message--type-error:before{background-color:var(--global-color-danger--normal)}:--c-message--type-tip:before{background-color:var(--global-color-extra--normal)}
@@ -1 +0,0 @@
1
- /*! @tacc/core-styles 2.13.0+ | MIT | github.com/TACC/Core-Styles */input,label,select,textarea{font-family:var(--global-font-family--sans--portal)}label{font-size:var(--global-font-size--small);font-weight:var(--medium);line-height:normal;margin-bottom:.75em}li>label:only-child{margin-bottom:unset}:not(input[type=checkbox])+label{display:block}fieldset:not(:last-child){margin-bottom:3.5rem}input,select,textarea{border:var(--global-border--normal)}::-moz-placeholder{color:var(--global-color-primary--dark)}::placeholder{color:var(--global-color-primary--dark)}input,select{box-sizing:content-box;height:1.4em}input[type=date],input[type=time]{font-family:var(--global-font-family--mono)}input[type=search]{outline-offset:revert}input:where([type=time],[type=date],[type=checkbox],[type=radio]){width:-moz-min-content;width:min-content}@media (pointer:coarse){input,select,textarea{padding:12px}}@media (pointer:fine),(pointer:none){input,select,textarea{padding:5px 10px}}
@@ -1,23 +0,0 @@
1
- @import url("../components/c-message.css");
2
- @import url("../components/c-message--expanded.css");
3
-
4
-
5
-
6
- /* Errors */
7
-
8
- .form-errors {
9
- @extend :--c-message;
10
- @extend :--c-message--type;
11
- @extend :--c-message--type-error;
12
- @extend :--c-message--scope;
13
- @extend :--c-message--scope-section;
14
- @extend :--c-message--type-error:--c-message--scope-section;
15
- }
16
- .field-errors li {
17
- @extend :--c-message;
18
- @extend :--c-message--type;
19
- @extend :--c-message--type-error;
20
- @extend :--c-message--scope;
21
- @extend :--c-message--scope-inline;
22
- @extend :--c-message--type-error:--c-message--scope-inline;
23
- }
File without changes