katalyst-koi 4.18.0 → 5.0.0.alpha.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 (222) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/koi/icons/add.svg +3 -0
  3. data/app/assets/images/koi/icons/close.svg +1 -0
  4. data/app/assets/images/koi/koi.png +0 -0
  5. data/app/assets/javascripts/koi/controllers/file_field_controller.js +2 -2
  6. data/app/assets/javascripts/koi/controllers/index.js +0 -3
  7. data/app/assets/javascripts/koi/controllers/koi/modal_controller.js +40 -0
  8. data/app/assets/javascripts/koi/controllers/navigation_controller.js +14 -21
  9. data/app/assets/javascripts/koi/controllers/webauthn_registration_controller.js +4 -1
  10. data/app/assets/stylesheets/koi/blocks/actions.css +8 -0
  11. data/app/assets/stylesheets/koi/blocks/application-header.css +15 -0
  12. data/app/assets/stylesheets/koi/blocks/application-navigation.css +54 -0
  13. data/app/assets/stylesheets/koi/blocks/button.css +90 -0
  14. data/app/assets/stylesheets/koi/blocks/flash.css +19 -0
  15. data/app/assets/stylesheets/koi/blocks/icon.css +15 -0
  16. data/app/assets/stylesheets/koi/blocks/index.css +13 -0
  17. data/app/assets/stylesheets/koi/blocks/modal.css +26 -0
  18. data/app/assets/stylesheets/koi/blocks/navigation.css +23 -0
  19. data/app/assets/stylesheets/koi/blocks/page-header.css +31 -0
  20. data/app/assets/stylesheets/koi/blocks/pagy.css +82 -0
  21. data/app/assets/stylesheets/koi/blocks/prose.css +37 -0
  22. data/app/assets/stylesheets/koi/blocks/tables/index.css +4 -0
  23. data/app/assets/stylesheets/koi/{components/_query.scss → blocks/tables/query.css} +13 -13
  24. data/app/assets/stylesheets/koi/{base/_tables.scss → blocks/tables/table.css} +11 -59
  25. data/app/assets/stylesheets/koi/compositions/cover.css +17 -0
  26. data/app/assets/stylesheets/koi/{base/_flow.scss → compositions/flow.css} +1 -1
  27. data/app/assets/stylesheets/koi/compositions/index.css +4 -0
  28. data/app/assets/stylesheets/koi/compositions/wrapper.css +11 -0
  29. data/app/assets/stylesheets/koi/forms/caption.css +22 -0
  30. data/app/assets/stylesheets/koi/forms/checkboxes.css +153 -0
  31. data/app/assets/stylesheets/koi/forms/date-input.css +12 -0
  32. data/app/assets/stylesheets/koi/{components/_document-field.scss → forms/document-field.css} +20 -15
  33. data/app/assets/stylesheets/koi/forms/errors.css +38 -0
  34. data/app/assets/stylesheets/koi/forms/fieldset.css +73 -0
  35. data/app/assets/stylesheets/koi/forms/file-upload.css +20 -0
  36. data/app/assets/stylesheets/koi/forms/form-group.css +19 -0
  37. data/app/assets/stylesheets/koi/forms/hint.css +11 -0
  38. data/app/assets/stylesheets/koi/forms/image-field.css +96 -0
  39. data/app/assets/stylesheets/koi/forms/index.css +44 -0
  40. data/app/assets/stylesheets/koi/forms/input.css +194 -0
  41. data/app/assets/stylesheets/koi/forms/label.css +43 -0
  42. data/app/assets/stylesheets/koi/forms/password.css +18 -0
  43. data/app/assets/stylesheets/koi/forms/radios.css +162 -0
  44. data/app/assets/stylesheets/koi/forms/select.css +18 -0
  45. data/app/assets/stylesheets/koi/forms/textarea.css +3 -0
  46. data/app/assets/stylesheets/koi/forms/trix.css +33 -0
  47. data/app/assets/stylesheets/koi/global/fonts.css +22 -0
  48. data/app/assets/stylesheets/koi/global/global-styles.css +297 -0
  49. data/app/assets/stylesheets/koi/global/reset.css +98 -0
  50. data/app/assets/stylesheets/koi/global/variables.css +97 -0
  51. data/app/assets/stylesheets/koi/icons.css +14 -0
  52. data/app/assets/stylesheets/koi/{admin.scss → index.css} +16 -7
  53. data/app/assets/stylesheets/koi/login.css +26 -0
  54. data/app/assets/stylesheets/koi/themes/_index.scss +0 -1
  55. data/app/assets/stylesheets/koi/utilities/index.css +1 -0
  56. data/app/assets/stylesheets/koi/utilities/visually-hidden.css +18 -0
  57. data/app/components/concerns/koi/tables/cells.rb +3 -3
  58. data/app/components/koi/header/edit_component.rb +1 -1
  59. data/app/components/koi/header/index_component.rb +1 -1
  60. data/app/components/koi/header/new_component.rb +1 -1
  61. data/app/components/koi/header/show_component.rb +1 -1
  62. data/app/components/koi/header_component.html.erb +12 -11
  63. data/app/components/koi/header_component.rb +4 -2
  64. data/app/components/koi/table_component.rb +8 -0
  65. data/app/controllers/admin/admin_users_controller.rb +24 -18
  66. data/app/controllers/admin/application_controller.rb +1 -3
  67. data/app/controllers/admin/credentials_controller.rb +18 -14
  68. data/app/controllers/admin/otps_controller.rb +15 -13
  69. data/app/controllers/admin/sessions_controller.rb +12 -1
  70. data/app/controllers/admin/url_rewrites_controller.rb +19 -17
  71. data/app/controllers/admin/well_knowns_controller.rb +20 -18
  72. data/app/controllers/concerns/koi/controller.rb +37 -0
  73. data/app/helpers/koi/form_helper.rb +18 -0
  74. data/app/helpers/koi/header_helper.rb +122 -0
  75. data/app/helpers/koi/index_actions_helper.rb +3 -2
  76. data/app/helpers/koi/modal_helper.rb +71 -0
  77. data/app/models/admin/user.rb +7 -1
  78. data/app/models/url_rewrite.rb +1 -9
  79. data/app/views/admin/admin_users/_form.html+self.erb +8 -0
  80. data/app/views/admin/admin_users/_form.html.erb +8 -0
  81. data/app/views/admin/admin_users/archived.html.erb +7 -4
  82. data/app/views/admin/admin_users/edit.html+self.erb +12 -0
  83. data/app/views/admin/admin_users/edit.html.erb +13 -8
  84. data/app/views/admin/admin_users/index.html.erb +10 -5
  85. data/app/views/admin/admin_users/new.html.erb +8 -8
  86. data/app/views/admin/admin_users/show.html+self.erb +26 -14
  87. data/app/views/admin/admin_users/show.html.erb +22 -20
  88. data/app/views/admin/credentials/_credentials.html+self.erb +8 -6
  89. data/app/views/admin/credentials/_credentials.html.erb +3 -1
  90. data/app/views/admin/credentials/create.turbo_stream.erb +4 -3
  91. data/app/views/admin/credentials/destroy.turbo_stream.erb +4 -2
  92. data/app/views/admin/credentials/new.html.erb +42 -36
  93. data/app/views/admin/dashboards/show.html.erb +13 -1
  94. data/app/views/admin/otps/_form.html.erb +7 -7
  95. data/app/views/admin/otps/create.turbo_stream.erb +3 -3
  96. data/app/views/admin/otps/new.html.erb +5 -3
  97. data/app/views/admin/sessions/new.html.erb +2 -3
  98. data/app/views/admin/sessions/otp.html.erb +1 -3
  99. data/app/views/admin/sessions/password.html.erb +1 -3
  100. data/app/views/admin/tokens/show.html.erb +4 -6
  101. data/app/views/admin/url_rewrites/_form.html.erb +9 -0
  102. data/app/views/admin/url_rewrites/edit.html.erb +13 -9
  103. data/app/views/admin/url_rewrites/index.html.erb +10 -7
  104. data/app/views/admin/url_rewrites/new.html.erb +8 -8
  105. data/app/views/admin/url_rewrites/show.html.erb +17 -12
  106. data/app/views/admin/well_knowns/_form.html.erb +9 -0
  107. data/app/views/admin/well_knowns/edit.html.erb +13 -9
  108. data/app/views/admin/well_knowns/index.html.erb +8 -5
  109. data/app/views/admin/well_knowns/new.html.erb +8 -8
  110. data/app/views/admin/well_knowns/show.html.erb +14 -13
  111. data/app/views/katalyst/content/asides/_aside.html+form.erb +6 -4
  112. data/app/views/katalyst/content/columns/_column.html+form.erb +5 -3
  113. data/app/views/katalyst/content/contents/_content.html+form.erb +8 -6
  114. data/app/views/katalyst/content/figures/_figure.html+form.erb +8 -5
  115. data/app/views/katalyst/content/groups/_group.html+form.erb +5 -3
  116. data/app/views/katalyst/content/items/_item.html+form.erb +5 -3
  117. data/app/views/katalyst/content/sections/_section.html+form.erb +5 -3
  118. data/app/views/katalyst/content/tables/_table.html+form.erb +16 -11
  119. data/app/views/katalyst/navigation/items/_button.html.erb +6 -12
  120. data/app/views/katalyst/navigation/items/_heading.html.erb +3 -10
  121. data/app/views/katalyst/navigation/items/_link.html.erb +6 -11
  122. data/app/views/katalyst/navigation/menus/edit.html.erb +10 -6
  123. data/app/views/katalyst/navigation/menus/index.html.erb +4 -2
  124. data/app/views/katalyst/navigation/menus/new.html.erb +5 -3
  125. data/app/views/katalyst/navigation/menus/show.html.erb +8 -7
  126. data/app/views/layouts/koi/_application_header.html.erb +20 -0
  127. data/app/views/layouts/koi/_application_navigation.html.erb +34 -0
  128. data/app/views/layouts/koi/_flash.html.erb +6 -3
  129. data/app/views/layouts/koi/_navigation_header.html.erb +0 -2
  130. data/app/views/layouts/koi/application.html.erb +22 -27
  131. data/app/views/layouts/koi/frame.html.erb +1 -3
  132. data/app/views/layouts/koi/login.html.erb +12 -5
  133. data/config/locales/koi.en.yml +9 -1
  134. data/config/routes.rb +1 -1
  135. data/lib/generators/koi/admin/admin_generator.rb +3 -12
  136. data/lib/generators/koi/admin_controller/admin_controller_generator.rb +6 -16
  137. data/lib/generators/koi/admin_controller/templates/controller.rb.tt +82 -18
  138. data/lib/generators/koi/admin_controller/templates/controller_spec.rb.tt +113 -47
  139. data/lib/generators/koi/admin_route/admin_route_generator.rb +60 -6
  140. data/lib/generators/koi/admin_views/USAGE +18 -7
  141. data/lib/generators/koi/admin_views/admin_views_generator.rb +19 -11
  142. data/lib/generators/koi/admin_views/templates/_form.html.erb.tt +8 -0
  143. data/lib/generators/koi/admin_views/templates/archived.html.erb.tt +33 -0
  144. data/lib/generators/koi/admin_views/templates/edit.html.erb.tt +17 -9
  145. data/lib/generators/koi/admin_views/templates/index.html.erb.tt +31 -3
  146. data/lib/generators/koi/admin_views/templates/new.html.erb.tt +8 -8
  147. data/lib/generators/koi/admin_views/templates/show.html.erb.tt +15 -18
  148. data/lib/generators/koi/helpers/attribute_helpers.rb +147 -0
  149. data/lib/generators/koi/helpers/attribute_types.rb +218 -0
  150. data/lib/generators/koi/helpers/resource_helpers.rb +121 -0
  151. data/lib/generators/koi/{active_record/active_record_generator.rb → model/model_generator.rb} +1 -1
  152. data/lib/koi/config.rb +3 -1
  153. data/lib/koi/engine.rb +0 -9
  154. data/lib/koi/form/builder.rb +4 -4
  155. data/lib/koi/form/content.rb +55 -0
  156. data/lib/koi/form/elements/document.rb +1 -1
  157. data/lib/koi/form/elements/image.rb +1 -1
  158. data/lib/koi/form_builder.rb +1 -0
  159. data/lib/koi/menu.rb +14 -1
  160. data/spec/factories/admins.rb +1 -1
  161. metadata +92 -101
  162. data/app/assets/builds/koi/admin.css +0 -1
  163. data/app/assets/stylesheets/koi/base/_button.scss +0 -122
  164. data/app/assets/stylesheets/koi/base/_icon.scss +0 -29
  165. data/app/assets/stylesheets/koi/base/_index.scss +0 -21
  166. data/app/assets/stylesheets/koi/base/_input.scss +0 -19
  167. data/app/assets/stylesheets/koi/base/_link.scss +0 -26
  168. data/app/assets/stylesheets/koi/base/_list.scss +0 -11
  169. data/app/assets/stylesheets/koi/base/_typography.scss +0 -160
  170. data/app/assets/stylesheets/koi/components/_actions-group.scss +0 -7
  171. data/app/assets/stylesheets/koi/components/_image-field.scss +0 -95
  172. data/app/assets/stylesheets/koi/components/_index.scss +0 -9
  173. data/app/assets/stylesheets/koi/components/_pagy.scss +0 -29
  174. data/app/assets/stylesheets/koi/components/_summary-list.scss +0 -40
  175. data/app/assets/stylesheets/koi/layouts/_banner.scss +0 -7
  176. data/app/assets/stylesheets/koi/layouts/_content.scss +0 -40
  177. data/app/assets/stylesheets/koi/layouts/_flash.scss +0 -41
  178. data/app/assets/stylesheets/koi/layouts/_header.scss +0 -61
  179. data/app/assets/stylesheets/koi/layouts/_index.scss +0 -48
  180. data/app/assets/stylesheets/koi/layouts/_main.scss +0 -23
  181. data/app/assets/stylesheets/koi/layouts/_navigation.scss +0 -180
  182. data/app/assets/stylesheets/koi/layouts/_stack.scss +0 -13
  183. data/app/assets/stylesheets/koi/pages/_index.scss +0 -1
  184. data/app/assets/stylesheets/koi/pages/_login.scss +0 -46
  185. data/app/assets/stylesheets/koi/themes/_govuk.scss +0 -56
  186. data/app/assets/stylesheets/koi/themes/_kpop.scss +0 -5
  187. data/app/assets/stylesheets/koi/utils/_breakpoints.scss +0 -13
  188. data/app/assets/stylesheets/koi/utils/_hide.scss +0 -11
  189. data/app/assets/stylesheets/koi/utils/_index.scss +0 -2
  190. data/app/assets/stylesheets/koi/utils/_typography.scss +0 -42
  191. data/app/components/koi/content/editor/item_form_component.html.erb +0 -11
  192. data/app/components/koi/content/editor/item_form_component.rb +0 -94
  193. data/app/components/koi/summary_list/attachment_component.rb +0 -47
  194. data/app/components/koi/summary_list/base.rb +0 -59
  195. data/app/components/koi/summary_list/boolean_component.rb +0 -15
  196. data/app/components/koi/summary_list/date_component.rb +0 -17
  197. data/app/components/koi/summary_list/datetime_component.rb +0 -17
  198. data/app/components/koi/summary_list/item_component.rb +0 -26
  199. data/app/components/koi/summary_list/number_component.rb +0 -21
  200. data/app/components/koi/summary_list/rich_text_component.rb +0 -8
  201. data/app/components/koi/summary_list/text_component.rb +0 -8
  202. data/app/components/koi/summary_list_component.html.erb +0 -5
  203. data/app/components/koi/summary_list_component.rb +0 -75
  204. data/app/controllers/concerns/koi/controller/is_admin_controller.rb +0 -66
  205. data/app/helpers/koi/application_helper.rb +0 -7
  206. data/app/helpers/koi/date_helper.rb +0 -26
  207. data/app/helpers/koi/definition_list_helper.rb +0 -10
  208. data/app/views/admin/admin_users/_fields.html+self.erb +0 -3
  209. data/app/views/admin/admin_users/_fields.html.erb +0 -3
  210. data/app/views/admin/url_rewrites/_fields.html.erb +0 -4
  211. data/app/views/admin/well_knowns/_fields.html.erb +0 -6
  212. data/app/views/layouts/koi/_environment.html.erb +0 -4
  213. data/app/views/layouts/koi/_header.html.erb +0 -11
  214. data/app/views/layouts/koi/_navigation.html.erb +0 -23
  215. data/app/views/layouts/koi/_navigation_collapse.html.erb +0 -3
  216. data/lib/generators/koi/admin_views/templates/_fields.html.erb.tt +0 -3
  217. data/lib/generators/koi/helpers/admin_generator_attributes.rb +0 -66
  218. data/lib/koi/extensions/dartsass.rb +0 -23
  219. /data/app/assets/stylesheets/koi/{components/_clipboard.scss → blocks/clipboard.css} +0 -0
  220. /data/app/assets/stylesheets/koi/{components/_index-actions.scss → blocks/index-actions.css} +0 -0
  221. /data/app/assets/stylesheets/koi/{components/_toolbar.scss → blocks/toolbar.css} +0 -0
  222. /data/app/assets/stylesheets/koi/{base/_repel.scss → compositions/repel.css} +0 -0
@@ -1,62 +1,13 @@
1
- @use "katalyst/tables";
2
- @use "button";
1
+ .katalyst-table {
2
+ --tag-color: var(--color-primary);
3
+ --on-tag-color: white;
3
4
 
4
- /* Table default styles */
5
-
6
- table {
7
- border: none;
8
- border-collapse: collapse;
9
- }
10
-
11
- thead {
12
- border-top: 1px solid var(--site-text-color);
13
- border-bottom: 1px solid var(--site-text-color);
14
- }
15
-
16
- th {
17
- text-align: left;
18
- font-weight: 600;
19
- line-height: 1.2;
20
- }
21
-
22
- tbody tr {
23
- box-shadow: inset 0 -1px 0 #ddd;
24
- }
25
-
26
- td,
27
- th {
28
- vertical-align: top;
29
- padding: var(--space-xs, 0.5rem) var(--space-s, 0.75rem);
30
-
31
- &:has(> a[href]:only-child) {
32
- padding: 0;
33
-
34
- a[href] {
35
- display: block;
36
- padding: var(--space-xs, 0.5rem) var(--space-s, 0.75rem);
37
- }
38
- }
39
- }
40
-
41
- thead th {
42
- white-space: nowrap;
43
- overflow-x: hidden;
44
- text-overflow: ellipsis;
45
- }
46
-
47
- caption {
48
- caption-side: bottom;
49
- margin-block-start: var(--space-s);
50
- }
51
-
52
- /* Katalyst tables overrides */
53
-
54
- .katalyst--table {
55
- :where(th[data-cell-type="selection"], td[data-cell-type="selection"]) {
56
- width: 2rem;
5
+ td.type-enum small {
6
+ color: var(--on-tag-color);
7
+ font-size: small;
57
8
  }
58
9
 
59
- [data-cell-type="selection"] {
10
+ .selection:has(input[type="checkbox"]) {
60
11
  position: relative;
61
12
  padding: 0;
62
13
 
@@ -142,10 +93,11 @@ caption {
142
93
  p {
143
94
  margin-bottom: 0.5rem;
144
95
  }
96
+ }
145
97
 
146
- button {
147
- @extend %button-base;
148
- }
98
+ .table-container {
99
+ overflow-x: auto;
100
+ max-width: 100%;
149
101
  }
150
102
 
151
103
  .katalyst--tables--query {
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Based on cover composition: https://every-layout.dev/layouts/cover/
3
+ */
4
+ .cover {
5
+ display: flex;
6
+ flex-direction: column;
7
+ min-block-size: 100vh;
8
+ padding: 1rem;
9
+ }
10
+
11
+ .cover > * {
12
+ margin-block: auto;
13
+ }
14
+
15
+ .cover[data-centered] {
16
+ align-items: center;
17
+ }
@@ -4,5 +4,5 @@ Like the Every Layout stack: https://every-layout.dev/layouts/stack/
4
4
  Info about this implementation: https://piccalil.li/quick-tip/flow-utility/
5
5
  */
6
6
  .flow > * + * {
7
- margin-top: var(--flow-space, 1em);
7
+ margin-top: var(--flow-space, var(--space-s));
8
8
  }
@@ -0,0 +1,4 @@
1
+ @import url("cover.css");
2
+ @import url("flow.css");
3
+ @import url("repel.css");
4
+ @import url("wrapper.css");
@@ -0,0 +1,11 @@
1
+ /*
2
+ WRAPPER COMPOSITION
3
+ A common wrapper/container
4
+ */
5
+ .wrapper {
6
+ margin-inline: auto;
7
+ max-width: var(--wrapper-max-width, 1360px);
8
+ padding-left: var(--gutter);
9
+ padding-right: var(--gutter);
10
+ position: relative;
11
+ }
@@ -0,0 +1,22 @@
1
+ .govuk-caption-xl,
2
+ .govuk-caption-l,
3
+ .govuk-caption-m {
4
+ color: var(--govuk-hint-color);
5
+ display: block;
6
+ font-weight: var(--font-regular);
7
+ line-height: var(--leading-fine);
8
+ }
9
+
10
+ .govuk-caption-xl {
11
+ font-size: var(--size-step-2);
12
+ margin-bottom: var(--space-3xs);
13
+ }
14
+
15
+ .govuk-caption-l {
16
+ font-size: var(--size-step-1);
17
+ margin-bottom: var(--space-3xs);
18
+ }
19
+
20
+ .govuk-caption-m {
21
+ font-size: var(--size-step-0);
22
+ }
@@ -0,0 +1,153 @@
1
+ .govuk-checkboxes--small {
2
+ --input-size: var(--small-input-size);
3
+ }
4
+
5
+ .govuk-checkboxes__item {
6
+ display: grid;
7
+ grid-template-areas: "input label" "input hint";
8
+ grid-template-columns: var(--input-size) 1fr;
9
+ grid-column-gap: var(--space-xs);
10
+ align-items: baseline;
11
+ }
12
+
13
+ .govuk-checkboxes__input {
14
+ cursor: pointer;
15
+ grid-area: input;
16
+ height: var(--input-size);
17
+ margin-block-start: calc(-0.5 * var(--input-size));
18
+ margin: 0;
19
+ opacity: 0;
20
+ translate: 0 calc(var(--stroke-input-width) + 0.25 * var(--input-size));
21
+ width: var(--input-size);
22
+ z-index: 1;
23
+ }
24
+
25
+ .govuk-checkboxes__item::before {
26
+ content: "";
27
+ aspect-ratio: 1;
28
+ background: transparent;
29
+ border-radius: var(--radius-s);
30
+ border: var(--stroke-input);
31
+ display: inline-block;
32
+ grid-area: input;
33
+ margin-block-start: calc(-0.5 * var(--input-size));
34
+ translate: 0 calc(var(--stroke-input-width) + 0.25 * var(--input-size));
35
+ }
36
+
37
+ .govuk-checkboxes__item::after {
38
+ content: "";
39
+ aspect-ratio: 1;
40
+ background: currentcolor;
41
+ border: calc(0.25 * var(--input-size)) solid currentcolor;
42
+ display: inline-block;
43
+ grid-area: input;
44
+ margin-block-start: calc(-0.5 * var(--input-size));
45
+ margin-inline: calc(0.25 * var(--input-size));
46
+ opacity: 0;
47
+ translate: 0 var(--stroke-input-width);
48
+ }
49
+
50
+ .govuk-checkboxes__label {
51
+ grid-area: label;
52
+ padding-block: calc(
53
+ var(--input-size) * 0.5 + var(--stroke-input-width) - 0.5em
54
+ );
55
+ cursor: pointer;
56
+ touch-action: manipulation;
57
+ margin-block-end: 0;
58
+ min-height: var(--input-size);
59
+ }
60
+
61
+ .govuk-checkboxes__hint {
62
+ grid-area: hint;
63
+ }
64
+
65
+ .govuk-checkboxes__label:has(+ .govuk-checkboxes__hint) {
66
+ padding-block-end: 0;
67
+ }
68
+
69
+ .govuk-checkboxes__item:has(.govuk-checkboxes__input:focus)::before {
70
+ border-width: calc(var(--stroke-input-width) + 1px);
71
+ outline: var(--focus-outline);
72
+ outline-offset: 0;
73
+ }
74
+
75
+ @media screen and (forced-colors: active), (-ms-high-contrast: active) {
76
+ .govuk-checkboxes__item:has(.govuk-checkboxes__input:focus)::before {
77
+ outline-color: Highlight;
78
+ }
79
+ }
80
+
81
+ .govuk-checkboxes__item:has(.govuk-checkboxes__input:checked)::after {
82
+ opacity: 1;
83
+ }
84
+
85
+ .govuk-checkboxes__input:disabled,
86
+ .govuk-checkboxes__input:disabled + .govuk-checkboxes__label {
87
+ cursor: not-allowed;
88
+ }
89
+
90
+ .govuk-checkboxes__input:disabled + .govuk-checkboxes__label,
91
+ .govuk-checkboxes__input:disabled ~ .govuk-hint {
92
+ opacity: 0.5;
93
+ }
94
+
95
+ .govuk-checkboxes__divider {
96
+ width: var(--input-size);
97
+ text-align: center;
98
+ }
99
+
100
+ .govuk-checkboxes__conditional {
101
+ margin-bottom: var(--space-s);
102
+ margin-left: calc(var(--input-size) * 0.5 - var(--stroke-input-width) * 0.5);
103
+ padding-left: calc(
104
+ var(--input-size) * 0.5 - var(--stroke-input-width) * 0.5 + var(--space-xs)
105
+ );
106
+ border-left: calc(2 * var(--stroke-input-width)) solid var(--color-mid);
107
+
108
+ > :not([type="hidden"]) + * {
109
+ margin-top: var(--flow-space, var(--space-xs));
110
+ }
111
+ }
112
+
113
+ .govuk-frontend-supported .govuk-checkboxes__conditional--hidden {
114
+ display: none;
115
+ }
116
+
117
+ .govuk-checkboxes--small {
118
+ .govuk-checkboxes__item:hover:has(
119
+ .govuk-checkboxes__input:not(:disabled)
120
+ )::before {
121
+ outline: var(--focus-width) 1px dashed transparent;
122
+ outline-offset: 1px;
123
+ box-shadow: 0 0 0 var(--space-3xs) var(--color-mid);
124
+ }
125
+
126
+ .govuk-checkboxes__item:hover:has(.govuk-checkboxes__input:focus)::before {
127
+ box-shadow:
128
+ 0 0 0 var(--focus-width) var(--focus-color),
129
+ 0 0 0 var(--space-3xs) var(--color-mid);
130
+ }
131
+ }
132
+
133
+ @media screen and (forced-colors: active), (-ms-high-contrast: active) {
134
+ .govuk-checkboxes--small {
135
+ .govuk-checkboxes__item:hover:has(.govuk-checkboxes__input:focus)::before {
136
+ outline-color: Highlight;
137
+ }
138
+ }
139
+ }
140
+
141
+ @media (hover: none), (pointer: coarse) {
142
+ .govuk-checkboxes--small {
143
+ .govuk-checkboxes__item:hover:has(
144
+ .govuk-checkboxes__input:not(:disabled)
145
+ )::before {
146
+ box-shadow: initial;
147
+ }
148
+
149
+ .govuk-checkboxes__item:hover:has(.govuk-checkboxes__input:focus)::before {
150
+ box-shadow: 0 0 0 var(--focus-width) var(--focus-color);
151
+ }
152
+ }
153
+ }
@@ -0,0 +1,12 @@
1
+ .govuk-date-input {
2
+ display: flex;
3
+ gap: var(--space-s);
4
+ }
5
+
6
+ .govuk-date-input__label {
7
+ display: block;
8
+ }
9
+
10
+ .govuk-date-input__input {
11
+ margin-bottom: 0;
12
+ }
@@ -7,7 +7,7 @@
7
7
  "preview"
8
8
  "file"
9
9
  "supplemental";
10
- grid-template-columns: minmax(auto, var(--text-width));
10
+ grid-template-columns: auto;
11
11
  grid-auto-rows: auto;
12
12
 
13
13
  label {
@@ -24,27 +24,32 @@
24
24
 
25
25
  input {
26
26
  grid-area: file;
27
- }
28
27
 
29
- .govuk-file-upload {
30
- margin-left: 0;
31
- padding: 3px;
32
- max-width: var(--text-width);
28
+ &::file-selector-button {
29
+ color: var(--color-dark);
30
+ background: var(--color-tint);
31
+ border: var(--stroke-input);
32
+ border-radius: var(--input-radius);
33
+ }
33
34
  }
34
35
 
35
36
  .preview-file {
36
37
  grid-area: preview;
37
38
  position: relative;
38
39
  overflow: visible;
39
- background-color: #f4f4f4;
40
- border: 2px solid black;
41
- margin-bottom: 0.5rem;
42
- padding: 5px;
43
- line-height: 1.5;
40
+ background-color: var(--color-tint);
41
+ border: var(--stroke-input);
42
+ border-radius: var(--input-radius);
43
+ margin-bottom: var(--space-2xs);
44
+ padding: var(--space-3xs);
45
+ line-height: var(--leading-standard);
44
46
  align-items: start;
45
- display: inline-flex;
46
47
  margin-right: auto;
47
48
 
49
+ &:not([hidden]) {
50
+ display: inline-flex;
51
+ }
52
+
48
53
  .preview-filename {
49
54
  line-height: unset;
50
55
  }
@@ -71,9 +76,9 @@
71
76
 
72
77
  > div:last-child {
73
78
  grid-area: supplemental;
74
- }
75
79
 
76
- .govuk-form-group {
77
- margin-top: 30px;
80
+ > * + * {
81
+ margin-top: var(--flow-space, var(--space-2xs));
82
+ }
78
83
  }
79
84
  }
@@ -0,0 +1,38 @@
1
+ :root {
2
+ --govuk-error-bar-padding: var(--space-xs);
3
+ --govuk-error-stroke-width: var(--space-3xs);
4
+ --govuk-error-stroke: var(--govuk-error-stroke-width) solid
5
+ var(--govuk-error-color);
6
+ }
7
+
8
+ .govuk-error-message {
9
+ font-weight: var(--font-bold);
10
+ font-size: var(--size-step-0);
11
+ line-height: var(--leading-fine);
12
+ margin-block-end: var(--space-xs);
13
+ color: var(--govuk-error-color);
14
+ }
15
+
16
+ /* error indicator as a bar next to group (excludes nested) */
17
+ .govuk-form-group--error:not(.govuk-form-group &) {
18
+ margin-left: calc(-1 * (var(--space-xs) + var(--govuk-error-stroke-width)));
19
+ border-left: var(--govuk-error-stroke);
20
+ padding-left: var(--space-xs);
21
+ }
22
+
23
+ .govuk-error-summary {
24
+ padding: var(--space-s);
25
+ border: var(--govuk-error-stroke);
26
+ }
27
+
28
+ .govuk-error-summary:focus {
29
+ outline: var(--focus-outline);
30
+ }
31
+
32
+ .govuk-error-summary__title {
33
+ font-size: var(--size-step-1);
34
+ line-height: var(--leading-fine);
35
+ font-weight: var(--font-bold);
36
+ margin-top: 0;
37
+ margin-bottom: var(--space-s);
38
+ }
@@ -0,0 +1,73 @@
1
+ fieldset {
2
+ border: var(--stroke);
3
+ padding: var(--space-s);
4
+ }
5
+
6
+ legend {
7
+ font-weight: var(--font-medium);
8
+ padding-inline: var(--space-xs);
9
+ }
10
+
11
+ .govuk-fieldset {
12
+ min-width: 0;
13
+ margin: 0;
14
+ padding: 0;
15
+ border: none;
16
+
17
+ > * + * {
18
+ margin-top: var(--flow-space, var(--space-2xs));
19
+ }
20
+
21
+ /* remove space created by hidden inputs */
22
+ &:has(> [type="hidden"]:first-child) {
23
+ margin-top: calc(-1 * var(--flow-space, var(--space-2xs)));
24
+ }
25
+ }
26
+
27
+ .govuk-fieldset__legend {
28
+ font-weight: var(--font-regular);
29
+ font-size: var(--size-step-0);
30
+ line-height: var(--leading-fine);
31
+ max-width: 100%;
32
+ padding: 0;
33
+ white-space: normal;
34
+
35
+ & + * {
36
+ --flow-space: var(--space-2xs);
37
+ }
38
+ }
39
+
40
+ .govuk-fieldset__legend--xl,
41
+ .govuk-fieldset__legend--l,
42
+ .govuk-fieldset__legend--m {
43
+ font-weight: var(--font-bold);
44
+
45
+ & + * {
46
+ --flow-space: var(--space-xs);
47
+ }
48
+ }
49
+
50
+ .govuk-fieldset__legend--xl {
51
+ font-size: var(--size-step-4);
52
+ line-height: var(--leading-fine);
53
+ }
54
+
55
+ .govuk-fieldset__legend--l {
56
+ font-size: var(--size-step-3);
57
+ line-height: var(--leading-fine);
58
+ }
59
+
60
+ .govuk-fieldset__legend--m {
61
+ font-size: var(--size-step-1);
62
+ line-height: var(--leading-fine);
63
+ }
64
+
65
+ .govuk-fieldset__legend--s {
66
+ font-weight: var(--font-bold);
67
+ }
68
+
69
+ .govuk-fieldset__heading {
70
+ margin: 0;
71
+ font-size: inherit;
72
+ font-weight: inherit;
73
+ }
@@ -0,0 +1,20 @@
1
+ .govuk-file-upload {
2
+ max-width: 100%;
3
+ }
4
+
5
+ .govuk-file-upload::-webkit-file-upload-button {
6
+ -webkit-appearance: button;
7
+ color: inherit;
8
+ font: inherit;
9
+ }
10
+
11
+ .govuk-file-upload:focus,
12
+ .govuk-file-upload:focus-within {
13
+ outline: var(--focus-outline);
14
+ box-shadow: var(--focus-shadow);
15
+ }
16
+
17
+ .govuk-file-upload:disabled {
18
+ opacity: 0.5;
19
+ cursor: not-allowed;
20
+ }
@@ -0,0 +1,19 @@
1
+ /* flow for form elements (mostly groups and fieldsets) */
2
+ form:not([class]),
3
+ .govuk-form {
4
+ > * + * {
5
+ margin-top: var(--flow-space, var(--space-m));
6
+ }
7
+
8
+ &:has(> [type="hidden"]:first-child) {
9
+ margin-top: calc(-1 * var(--flow-space, var(--space-m)));
10
+ }
11
+ }
12
+
13
+ .govuk-form-group {
14
+ container: form-group / inline-size;
15
+
16
+ .govuk-form-group {
17
+ container: unset;
18
+ }
19
+ }
@@ -0,0 +1,11 @@
1
+ .govuk-hint {
2
+ font-weight: var(--font-regular);
3
+ font-size: var(--size-step-0);
4
+ line-height: var(--leading-fine);
5
+ color: var(--govuk-hint-color);
6
+ margin-block-end: var(--space-3xs);
7
+ }
8
+
9
+ .govuk-fieldset__legend + .govuk-hint {
10
+ --flow-space: var(--space-2xs);
11
+ }
@@ -0,0 +1,96 @@
1
+ .govuk-image-field {
2
+ display: grid;
3
+ grid-template-areas:
4
+ "label preview"
5
+ "hint preview"
6
+ "error preview"
7
+ "file preview"
8
+ "supplemental supplemental";
9
+ grid-template-columns: 1fr auto;
10
+ grid-template-rows: auto auto auto 1fr auto;
11
+ gap: 0 1rem;
12
+
13
+ label {
14
+ grid-area: label;
15
+ }
16
+
17
+ .govuk-hint {
18
+ grid-area: hint;
19
+ }
20
+
21
+ .govuk-error-message {
22
+ grid-area: error;
23
+ }
24
+
25
+ input {
26
+ grid-area: file;
27
+ align-self: start;
28
+
29
+ &::file-selector-button {
30
+ color: var(--color-dark);
31
+ background: var(--color-tint);
32
+ border: var(--stroke-input);
33
+ border-radius: var(--input-radius);
34
+ }
35
+ }
36
+
37
+ .preview-image {
38
+ grid-area: preview;
39
+ position: relative;
40
+ display: grid;
41
+ overflow: visible;
42
+ align-self: start;
43
+ align-items: center;
44
+ justify-items: center;
45
+ background-color: var(--color-tint);
46
+ border: var(--stroke-input);
47
+ border-radius: var(--input-radius);
48
+
49
+ min-width: calc(8em + 2 * var(--stroke-input-width));
50
+ aspect-ratio: 1;
51
+
52
+ .image-thumbnail {
53
+ max-width: 8em;
54
+ max-height: 8em;
55
+ }
56
+ }
57
+
58
+ .file-destroy {
59
+ appearance: none;
60
+ position: absolute;
61
+ background-color: var(--color-tint);
62
+ color: var(--color-dark);
63
+ border-radius: var(--input-radius);
64
+ border: var(--stroke-input);
65
+ display: block;
66
+ padding: 0;
67
+ top: calc(-1 * var(--stroke-input-width));
68
+ right: calc(-1 * var(--stroke-input-width));
69
+
70
+ &::after {
71
+ content: "×";
72
+ display: block;
73
+ position: relative;
74
+ width: 21px;
75
+ line-height: 21px;
76
+ font-size: 21px;
77
+ top: -1px;
78
+ }
79
+ }
80
+
81
+ > div:last-child {
82
+ grid-area: supplemental;
83
+
84
+ > * + * {
85
+ margin-top: var(--flow-space, var(--space-2xs));
86
+ }
87
+ }
88
+
89
+ .preview-image[hidden] {
90
+ display: block !important;
91
+
92
+ .file-destroy {
93
+ display: none;
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,44 @@
1
+ @import url("label.css");
2
+ @import url("hint.css");
3
+ @import url("caption.css");
4
+
5
+ @import url("form-group.css");
6
+ @import url("fieldset.css");
7
+ @import url("errors.css");
8
+
9
+ @import url("input.css");
10
+ @import url("checkboxes.css");
11
+ @import url("date-input.css");
12
+ @import url("file-upload.css");
13
+ @import url("image-field.css");
14
+ @import url("document-field.css");
15
+ @import url("radios.css");
16
+ @import url("password.css");
17
+ @import url("select.css");
18
+ @import url("textarea.css");
19
+ @import url("trix.css");
20
+
21
+ :root {
22
+ --stroke-input-width: 2px;
23
+ --stroke-input: var(--stroke-input-width) solid var(--color-dark);
24
+ --input-radius: 0.2rem;
25
+ --input-size: var(--size-step-4);
26
+ --small-input-size: var(--size-step-2);
27
+ --focus-width: 2px;
28
+ --focus-outline: var(--focus-width) solid var(--focus-color);
29
+ --focus-shadow: currentColor inset 0 0 0 1px;
30
+ --govuk-error-color: var(--color-alert);
31
+ --govuk-hint-color: var(--color-mid);
32
+ }
33
+
34
+ .govuk-visually-hidden {
35
+ border: 0;
36
+ clip: rect(0 0 0 0);
37
+ height: auto;
38
+ margin: 0;
39
+ overflow: hidden;
40
+ padding: 0;
41
+ position: absolute;
42
+ width: 1px;
43
+ white-space: nowrap;
44
+ }