@brandlab-digital/site-next 3.9.0 → 3.11.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 (143) hide show
  1. package/README.md +33 -0
  2. package/dist/contact/attachments-client.d.ts +3 -0
  3. package/dist/contact/attachments-client.d.ts.map +1 -1
  4. package/dist/contact/attachments-client.js +31 -8
  5. package/dist/contact/attachments-client.js.map +1 -1
  6. package/dist/contact/client-entry.d.ts +1 -1
  7. package/dist/contact/client-entry.d.ts.map +1 -1
  8. package/dist/contact/client-entry.js.map +1 -1
  9. package/dist/contact/contract.d.ts.map +1 -1
  10. package/dist/contact/contract.js +2 -2
  11. package/dist/contact/contract.js.map +1 -1
  12. package/dist/contact/email.d.ts.map +1 -1
  13. package/dist/contact/email.js +9 -0
  14. package/dist/contact/email.js.map +1 -1
  15. package/dist/contact/form-client.d.ts +4 -2
  16. package/dist/contact/form-client.d.ts.map +1 -1
  17. package/dist/contact/form-client.js +49 -13
  18. package/dist/contact/form-client.js.map +1 -1
  19. package/dist/contact/rate-limit.d.ts +59 -0
  20. package/dist/contact/rate-limit.d.ts.map +1 -0
  21. package/dist/contact/rate-limit.js +109 -0
  22. package/dist/contact/rate-limit.js.map +1 -0
  23. package/dist/contact/route-handler.d.ts +6 -0
  24. package/dist/contact/route-handler.d.ts.map +1 -1
  25. package/dist/contact/route-handler.js +4 -0
  26. package/dist/contact/route-handler.js.map +1 -1
  27. package/dist/contact/server-entry.d.ts +1 -1
  28. package/dist/contact/server-entry.d.ts.map +1 -1
  29. package/dist/contact/server-entry.js +1 -1
  30. package/dist/contact/server-entry.js.map +1 -1
  31. package/dist/contact/server.d.ts +9 -0
  32. package/dist/contact/server.d.ts.map +1 -1
  33. package/dist/contact/server.js +71 -7
  34. package/dist/contact/server.js.map +1 -1
  35. package/dist/contact/shared.d.ts +11 -0
  36. package/dist/contact/shared.d.ts.map +1 -1
  37. package/dist/contact/shared.js +11 -0
  38. package/dist/contact/shared.js.map +1 -1
  39. package/dist/contact/testing.d.ts +5 -0
  40. package/dist/contact/testing.d.ts.map +1 -1
  41. package/dist/contact/testing.js +1 -0
  42. package/dist/contact/testing.js.map +1 -1
  43. package/dist/lead-reporting.d.ts +6 -0
  44. package/dist/lead-reporting.d.ts.map +1 -1
  45. package/dist/lead-reporting.js +13 -1
  46. package/dist/lead-reporting.js.map +1 -1
  47. package/dist/ui-kit/brandlab-skin.d.ts +34 -0
  48. package/dist/ui-kit/brandlab-skin.d.ts.map +1 -1
  49. package/dist/ui-kit/brandlab-skin.js.map +1 -1
  50. package/dist/ui-kit/form/copy.d.ts +3 -0
  51. package/dist/ui-kit/form/copy.d.ts.map +1 -0
  52. package/dist/ui-kit/form/copy.js +5 -0
  53. package/dist/ui-kit/form/copy.js.map +1 -0
  54. package/dist/ui-kit/form/dialog.d.ts +24 -0
  55. package/dist/ui-kit/form/dialog.d.ts.map +1 -0
  56. package/dist/ui-kit/form/dialog.js +17 -0
  57. package/dist/ui-kit/form/dialog.js.map +1 -0
  58. package/dist/ui-kit/form/field.d.ts +30 -0
  59. package/dist/ui-kit/form/field.d.ts.map +1 -0
  60. package/dist/ui-kit/form/field.js +11 -0
  61. package/dist/ui-kit/form/field.js.map +1 -0
  62. package/dist/ui-kit/form/index.d.ts +7 -0
  63. package/dist/ui-kit/form/index.d.ts.map +1 -0
  64. package/dist/ui-kit/form/index.js +7 -0
  65. package/dist/ui-kit/form/index.js.map +1 -0
  66. package/dist/ui-kit/form/photo-upload.d.ts +37 -0
  67. package/dist/ui-kit/form/photo-upload.d.ts.map +1 -0
  68. package/dist/ui-kit/form/photo-upload.js +19 -0
  69. package/dist/ui-kit/form/photo-upload.js.map +1 -0
  70. package/dist/ui-kit/form/quote-dialog.d.ts +15 -0
  71. package/dist/ui-kit/form/quote-dialog.d.ts.map +1 -0
  72. package/dist/ui-kit/form/quote-dialog.js +68 -0
  73. package/dist/ui-kit/form/quote-dialog.js.map +1 -0
  74. package/dist/ui-kit/form/quote-form.d.ts +165 -0
  75. package/dist/ui-kit/form/quote-form.d.ts.map +1 -0
  76. package/dist/ui-kit/form/quote-form.js +235 -0
  77. package/dist/ui-kit/form/quote-form.js.map +1 -0
  78. package/dist/ui-kit/form/thank-you.d.ts +37 -0
  79. package/dist/ui-kit/form/thank-you.d.ts.map +1 -0
  80. package/dist/ui-kit/form/thank-you.js +36 -0
  81. package/dist/ui-kit/form/thank-you.js.map +1 -0
  82. package/dist/ui-kit/sections/accordion.d.ts +25 -0
  83. package/dist/ui-kit/sections/accordion.d.ts.map +1 -0
  84. package/dist/ui-kit/sections/accordion.js +14 -0
  85. package/dist/ui-kit/sections/accordion.js.map +1 -0
  86. package/dist/ui-kit/sections/contact-block.d.ts +51 -0
  87. package/dist/ui-kit/sections/contact-block.d.ts.map +1 -0
  88. package/dist/ui-kit/sections/contact-block.js +15 -0
  89. package/dist/ui-kit/sections/contact-block.js.map +1 -0
  90. package/dist/ui-kit/sections/cta-band.d.ts +59 -0
  91. package/dist/ui-kit/sections/cta-band.d.ts.map +1 -0
  92. package/dist/ui-kit/sections/cta-band.js +11 -0
  93. package/dist/ui-kit/sections/cta-band.js.map +1 -0
  94. package/dist/ui-kit/sections/faqs.d.ts +43 -0
  95. package/dist/ui-kit/sections/faqs.d.ts.map +1 -0
  96. package/dist/ui-kit/sections/faqs.js +40 -0
  97. package/dist/ui-kit/sections/faqs.js.map +1 -0
  98. package/dist/ui-kit/sections/index.d.ts +13 -0
  99. package/dist/ui-kit/sections/index.d.ts.map +1 -0
  100. package/dist/ui-kit/sections/index.js +13 -0
  101. package/dist/ui-kit/sections/index.js.map +1 -0
  102. package/dist/ui-kit/sections/page-header.d.ts +29 -0
  103. package/dist/ui-kit/sections/page-header.d.ts.map +1 -0
  104. package/dist/ui-kit/sections/page-header.js +9 -0
  105. package/dist/ui-kit/sections/page-header.js.map +1 -0
  106. package/dist/ui-kit/sections/price-guide.d.ts +56 -0
  107. package/dist/ui-kit/sections/price-guide.d.ts.map +1 -0
  108. package/dist/ui-kit/sections/price-guide.js +28 -0
  109. package/dist/ui-kit/sections/price-guide.js.map +1 -0
  110. package/dist/ui-kit/sections/price-table.d.ts +44 -0
  111. package/dist/ui-kit/sections/price-table.d.ts.map +1 -0
  112. package/dist/ui-kit/sections/price-table.js +29 -0
  113. package/dist/ui-kit/sections/price-table.js.map +1 -0
  114. package/dist/ui-kit/sections/proof-strip.d.ts +57 -0
  115. package/dist/ui-kit/sections/proof-strip.d.ts.map +1 -0
  116. package/dist/ui-kit/sections/proof-strip.js +20 -0
  117. package/dist/ui-kit/sections/proof-strip.js.map +1 -0
  118. package/dist/ui-kit/sections/rating-chip.d.ts +25 -0
  119. package/dist/ui-kit/sections/rating-chip.d.ts.map +1 -0
  120. package/dist/ui-kit/sections/rating-chip.js +15 -0
  121. package/dist/ui-kit/sections/rating-chip.js.map +1 -0
  122. package/dist/ui-kit/sections/reviews-band.d.ts +110 -0
  123. package/dist/ui-kit/sections/reviews-band.d.ts.map +1 -0
  124. package/dist/ui-kit/sections/reviews-band.js +104 -0
  125. package/dist/ui-kit/sections/reviews-band.js.map +1 -0
  126. package/dist/ui-kit/sections/section-sequence.d.ts +39 -0
  127. package/dist/ui-kit/sections/section-sequence.d.ts.map +1 -0
  128. package/dist/ui-kit/sections/section-sequence.js +34 -0
  129. package/dist/ui-kit/sections/section-sequence.js.map +1 -0
  130. package/dist/ui-kit/sections/site-footer-columns.d.ts +12 -0
  131. package/dist/ui-kit/sections/site-footer-columns.d.ts.map +1 -0
  132. package/dist/ui-kit/sections/site-footer-columns.js +63 -0
  133. package/dist/ui-kit/sections/site-footer-columns.js.map +1 -0
  134. package/dist/ui-kit/sections/site-footer.d.ts +59 -0
  135. package/dist/ui-kit/sections/site-footer.d.ts.map +1 -0
  136. package/dist/ui-kit/sections/site-footer.js +41 -0
  137. package/dist/ui-kit/sections/site-footer.js.map +1 -0
  138. package/dist/ui-kit/structure.css +766 -0
  139. package/dist/ui.d.ts +10 -1
  140. package/dist/ui.d.ts.map +1 -1
  141. package/dist/ui.js +3 -3
  142. package/dist/ui.js.map +1 -1
  143. package/package.json +10 -2
@@ -714,4 +714,770 @@
714
714
  outline: none;
715
715
  }
716
716
 
717
+ /* 20-form.css */
718
+ /* Quote form, photo upload and fields: layout and behaviour only. Labels sit above fields; one column below 640 px. */
719
+
720
+ /* A size container can't take its width from its content, so it fills its parent even inside a shrink-to-fit box. */
721
+ [data-bl='quote-form'] {
722
+ display: grid;
723
+ gap: 1.25rem;
724
+ inline-size: 100%;
725
+ container-type: inline-size;
726
+ }
727
+ [data-bl='quote-form'][data-density='compact'] {
728
+ gap: 0.875rem;
729
+ }
730
+ [data-bl='quote-form'] [data-slot='row'] {
731
+ display: grid;
732
+ gap: inherit;
733
+ grid-template-columns: minmax(0, 1fr);
734
+ }
735
+ @media (min-width: 640px) {
736
+ @container (min-width: 28rem) {
737
+ [data-bl='quote-form'] [data-slot='row'] {
738
+ grid-template-columns: repeat(2, minmax(0, 1fr));
739
+ }
740
+ }
741
+ }
742
+
743
+ :where([data-bl='quote-form'], [data-bl='field'], [data-bl='photo-upload']) {
744
+ min-width: 0;
745
+ }
746
+ [data-bl='field'],
747
+ [data-bl='photo-upload'] {
748
+ display: grid;
749
+ gap: 0.375rem;
750
+ align-content: start;
751
+ }
752
+ :where([data-bl='quote-form'], [data-bl='field']) :where(input:not([type='file']), textarea, select) {
753
+ width: 100%;
754
+ min-height: 44px;
755
+ font: inherit;
756
+ }
757
+ :where([data-bl='quote-form'], [data-bl='field']) textarea {
758
+ resize: vertical;
759
+ }
760
+
761
+ /* The drop box: the label covers the whole box, so a tap anywhere opens the picker; the hidden input keeps focus. */
762
+ [data-bl='photo-upload'] [data-slot='drop'] {
763
+ position: relative;
764
+ display: flex;
765
+ flex-wrap: wrap;
766
+ align-items: center;
767
+ justify-content: space-between;
768
+ gap: 0.5rem 1rem;
769
+ min-height: 44px;
770
+ padding: 0.75rem 1rem;
771
+ border: 1px dashed var(--bl-color-line, currentColor);
772
+ border-radius: var(--bl-radius-control, 0);
773
+ cursor: pointer;
774
+ }
775
+ [data-bl='photo-upload'] [data-slot='drop'][data-disabled='true'] {
776
+ cursor: not-allowed;
777
+ }
778
+ [data-bl='photo-upload'] [data-slot='drop'][data-state='busy'] {
779
+ cursor: progress;
780
+ }
781
+ [data-bl='photo-upload'] [data-slot='drop']:has(input:focus-visible) {
782
+ outline: 2px solid var(--bl-color-focus, currentColor);
783
+ outline-offset: 3px;
784
+ }
785
+ [data-bl='photo-upload'] [data-slot='drop'] [data-slot='label'] {
786
+ display: inline-flex;
787
+ align-items: center;
788
+ gap: 0.5rem;
789
+ cursor: inherit;
790
+ }
791
+ [data-bl='photo-upload'] [data-slot='drop'] [data-slot='label']::after {
792
+ content: '';
793
+ position: absolute;
794
+ inset: 0;
795
+ }
796
+ [data-bl='photo-upload'] [data-slot='dropIcon'] svg {
797
+ width: 1.5em;
798
+ height: 1.5em;
799
+ }
800
+ [data-bl='photo-upload'] [data-slot='photos'] {
801
+ display: flex;
802
+ flex-wrap: wrap;
803
+ gap: 0.75rem;
804
+ margin: 0;
805
+ padding: 0;
806
+ list-style: none;
807
+ }
808
+ [data-bl='photo-upload'] [data-slot='photo'] {
809
+ position: relative;
810
+ }
811
+ [data-bl='photo-upload'] [data-slot='thumb'] {
812
+ display: block;
813
+ width: 4rem;
814
+ height: 4rem;
815
+ object-fit: cover;
816
+ border-radius: var(--bl-radius-control, 0);
817
+ }
818
+ [data-bl='photo-upload'] [data-slot='remove'] {
819
+ position: absolute;
820
+ inset-block-start: -0.75rem;
821
+ inset-inline-end: -0.75rem;
822
+ display: inline-flex;
823
+ align-items: center;
824
+ justify-content: center;
825
+ min-width: 44px;
826
+ min-height: 44px;
827
+ padding: 0;
828
+ border: 0;
829
+ background: none;
830
+ color: inherit;
831
+ cursor: pointer;
832
+ }
833
+ [data-bl='photo-upload'] [data-slot='remove'] svg {
834
+ width: 1.25rem;
835
+ height: 1.25rem;
836
+ }
837
+
838
+ [data-bl='quote-form'] [data-slot='submit'] {
839
+ display: inline-flex;
840
+ align-items: center;
841
+ justify-content: center;
842
+ gap: 0.5rem;
843
+ min-height: 44px;
844
+ justify-self: start;
845
+ }
846
+ [data-bl='quote-form'][data-variant='card'] [data-slot='submit'],
847
+ [data-bl='quote-form'][data-variant='inline'] [data-slot='submit'] {
848
+ justify-self: stretch;
849
+ }
850
+ [data-bl='quote-form'] [data-slot='submit'][data-state='busy'] {
851
+ cursor: progress;
852
+ }
853
+ [data-bl='quote-form'] :where([data-slot='consent'], [data-slot='status']) {
854
+ margin: 0;
855
+ }
856
+ /* Empty, the status region stays in the accessibility tree (visually hidden), so its next message is announced. */
857
+ [data-bl='quote-form'] [data-slot='status']:empty {
858
+ position: absolute;
859
+ width: 1px;
860
+ height: 1px;
861
+ overflow: hidden;
862
+ clip-path: inset(50%);
863
+ white-space: nowrap;
864
+ }
865
+
866
+ /* 21-dialog.css */
867
+ /* Dialog: a native modal. The page behind doesn't scroll; the body scrolls inside the panel on short screens. */
868
+
869
+ [data-bl='dialog'] {
870
+ width: min(40rem, calc(100% - 2 * var(--bl-gutter, 1rem)));
871
+ max-height: calc(100dvh - 2rem);
872
+ padding: 0;
873
+ border: 0;
874
+ overflow: auto;
875
+ background: var(--bl-color-surface, Canvas);
876
+ color: var(--bl-color-ink, CanvasText);
877
+ border-radius: var(--bl-radius-card, 0);
878
+ box-shadow: var(--bl-shadow-overlay, none);
879
+ }
880
+ :root:has([data-bl='dialog'][open]) {
881
+ overflow: hidden;
882
+ }
883
+ [data-bl='dialog'] [data-slot='header'] {
884
+ display: flex;
885
+ align-items: flex-start;
886
+ justify-content: space-between;
887
+ gap: 1rem;
888
+ padding: 1rem var(--bl-gutter, 1.25rem) 0;
889
+ }
890
+ [data-bl='dialog'] [data-slot='title'] {
891
+ margin: 0;
892
+ }
893
+ [data-bl='dialog'] [data-slot='close'] {
894
+ display: inline-flex;
895
+ align-items: center;
896
+ justify-content: center;
897
+ flex-shrink: 0;
898
+ min-width: 44px;
899
+ min-height: 44px;
900
+ padding: 0;
901
+ border: 0;
902
+ background: none;
903
+ color: inherit;
904
+ cursor: pointer;
905
+ }
906
+ [data-bl='dialog'] [data-slot='close'] svg {
907
+ width: 1.5rem;
908
+ height: 1.5rem;
909
+ }
910
+ [data-bl='dialog'] [data-slot='body'] {
911
+ padding: 1rem var(--bl-gutter, 1.25rem) var(--bl-gutter, 1.25rem);
912
+ }
913
+
914
+ /* 30-reviews.css */
915
+ /* S7 reviews band and the rating chip: layout only. Colours, fonts and shapes come from each site's skin. */
916
+
917
+ [data-bl='rating-chip'] {
918
+ display: inline-flex;
919
+ flex-wrap: wrap;
920
+ align-items: center;
921
+ gap: 0.35rem 0.5rem;
922
+ margin: 0;
923
+ }
924
+ [data-bl='rating-chip'] > [data-slot='source'] {
925
+ display: inline-flex;
926
+ align-items: center;
927
+ min-height: 24px;
928
+ }
929
+
930
+ [data-bl-section='reviews'] {
931
+ container: bl-reviews / inline-size;
932
+ isolation: isolate;
933
+ }
934
+ [data-bl-section='reviews'] :where(ul[data-slot='list'], figure, blockquote, blockquote p, [data-slot='disclosure']) {
935
+ margin: 0;
936
+ }
937
+ [data-bl-section='reviews'] [data-slot='top'] {
938
+ display: flex;
939
+ flex-wrap: wrap;
940
+ align-items: flex-end;
941
+ justify-content: space-between;
942
+ gap: 1.5rem 2.5rem;
943
+ }
944
+ [data-bl-section='reviews'][data-align='center'] [data-slot='top'] {
945
+ flex-direction: column;
946
+ align-items: center;
947
+ text-align: center;
948
+ }
949
+ [data-bl-section='reviews'] [data-slot='list'] {
950
+ display: grid;
951
+ gap: 1.25rem;
952
+ margin-top: 2.5rem;
953
+ padding: 0;
954
+ list-style: none;
955
+ }
956
+ [data-bl-section='reviews'] [data-slot='item'] > figure {
957
+ display: flex;
958
+ flex-direction: column;
959
+ gap: 1rem;
960
+ height: 100%;
961
+ }
962
+ [data-bl-section='reviews'] [data-slot='quote'] {
963
+ flex: 1;
964
+ }
965
+ /* The reviewer's own line breaks stay. */
966
+ [data-bl-section='reviews'] [data-slot='quote'] p {
967
+ white-space: pre-line;
968
+ }
969
+ [data-bl-section='reviews'] [data-slot='more'] {
970
+ margin-top: 0.5rem;
971
+ }
972
+ [data-bl-section='reviews'] [data-slot='more'] > summary {
973
+ min-height: 24px;
974
+ cursor: pointer;
975
+ }
976
+ [data-bl-section='reviews'] [data-slot='more'][open] > summary {
977
+ margin-bottom: 0.5rem;
978
+ }
979
+ [data-bl-section='reviews'] [data-slot='author'] {
980
+ display: grid;
981
+ grid-template-columns: auto 1fr;
982
+ column-gap: 0.75rem;
983
+ align-items: center;
984
+ }
985
+ [data-bl-section='reviews'] [data-slot='avatar'] {
986
+ grid-row: span 2;
987
+ width: 48px;
988
+ height: 48px;
989
+ object-fit: cover;
990
+ }
991
+ [data-bl-section='reviews'] [data-slot='author'] > :not([data-slot='avatar']) {
992
+ grid-column: 2;
993
+ }
994
+ [data-bl-section='reviews'] [data-slot='author']:not(:has([data-slot='avatar'])) {
995
+ grid-template-columns: 1fr;
996
+ }
997
+ [data-bl-section='reviews'] [data-slot='author']:not(:has([data-slot='avatar'])) > * {
998
+ grid-column: 1;
999
+ }
1000
+ [data-bl-section='reviews'] [data-slot='disclosure'] {
1001
+ margin-top: 2rem;
1002
+ }
1003
+ [data-bl-section='reviews'][data-align='center'] [data-slot='disclosure'] {
1004
+ text-align: center;
1005
+ }
1006
+ [data-bl-section='reviews'] [data-slot='profileLink'] {
1007
+ display: inline-flex;
1008
+ align-items: center;
1009
+ min-height: 24px;
1010
+ }
1011
+
1012
+ /* The reviews page: a wall of every review, in balanced columns. */
1013
+ [data-bl-section='reviews'][data-variant='wall'] [data-slot='list'] {
1014
+ display: block;
1015
+ columns: 1;
1016
+ column-gap: 1.25rem;
1017
+ }
1018
+ [data-bl-section='reviews'][data-variant='wall'] [data-slot='item'] {
1019
+ break-inside: avoid;
1020
+ margin-bottom: 1.25rem;
1021
+ }
1022
+
1023
+ @container bl-reviews (min-width: 768px) {
1024
+ [data-bl-section='reviews']:is([data-columns='2'], [data-columns='3']) [data-slot='list'] {
1025
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1026
+ }
1027
+ [data-bl-section='reviews'][data-variant='feature'] [data-slot='list'] {
1028
+ grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr);
1029
+ align-items: start;
1030
+ }
1031
+ [data-bl-section='reviews'][data-variant='feature'] [data-slot='item'][data-lead='true'] {
1032
+ grid-row: span 2;
1033
+ }
1034
+ [data-bl-section='reviews'][data-variant='wall']:is([data-columns='2'], [data-columns='3']) [data-slot='list'] {
1035
+ columns: 2;
1036
+ }
1037
+ }
1038
+ @container bl-reviews (min-width: 1024px) {
1039
+ [data-bl-section='reviews'][data-columns='3']:not([data-variant='feature']) [data-slot='list'] {
1040
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1041
+ }
1042
+ [data-bl-section='reviews'][data-variant='wall'][data-columns='3'] [data-slot='list'] {
1043
+ columns: 3;
1044
+ }
1045
+ }
1046
+
1047
+ /* 31-cta.css */
1048
+ /* S8 CTA band: layout only. The photo variant's backdrop fills the band behind the content. */
1049
+
1050
+ [data-bl-section='cta'] {
1051
+ container: bl-cta / inline-size;
1052
+ isolation: isolate;
1053
+ }
1054
+ [data-bl-section='cta'] :where(h2, p) {
1055
+ margin: 0;
1056
+ }
1057
+ [data-bl-section='cta'] > [data-slot='media'] {
1058
+ position: absolute;
1059
+ inset: 0;
1060
+ z-index: -1;
1061
+ overflow: hidden;
1062
+ pointer-events: none;
1063
+ }
1064
+ [data-bl-section='cta'] > [data-slot='media'] :where(img, picture, video) {
1065
+ display: block;
1066
+ width: 100%;
1067
+ height: 100%;
1068
+ object-fit: cover;
1069
+ }
1070
+ [data-bl-section='cta'] [data-slot='content'] {
1071
+ display: grid;
1072
+ justify-items: start;
1073
+ align-content: start;
1074
+ gap: 1rem;
1075
+ }
1076
+ [data-bl-section='cta'][data-align='center'] [data-slot='content'] {
1077
+ justify-items: center;
1078
+ text-align: center;
1079
+ }
1080
+ [data-bl-section='cta'] [data-slot='actions'] {
1081
+ display: flex;
1082
+ flex-wrap: wrap;
1083
+ align-items: center;
1084
+ gap: 0.75rem 1.25rem;
1085
+ margin-top: 0.5rem;
1086
+ }
1087
+ [data-bl-section='cta'][data-align='center'] [data-slot='actions'] {
1088
+ justify-content: center;
1089
+ }
1090
+ [data-bl-section='cta'][data-variant='form'] > [data-slot='inner'] {
1091
+ display: grid;
1092
+ gap: 2.5rem;
1093
+ }
1094
+
1095
+ @container bl-cta (min-width: 1024px) {
1096
+ [data-bl-section='cta'][data-variant='form'] > [data-slot='inner'] {
1097
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr);
1098
+ align-items: start;
1099
+ gap: 4rem;
1100
+ }
1101
+ }
1102
+
1103
+ /* 32-footer.css */
1104
+ /* S27 footer: layout only. Tone (light, ink or the photo panel) comes from each site's skin. */
1105
+
1106
+ [data-bl='footer'] {
1107
+ position: relative;
1108
+ isolation: isolate;
1109
+ container: bl-footer / inline-size;
1110
+ }
1111
+ [data-bl='footer'] :where(ul) {
1112
+ margin: 0;
1113
+ padding: 0;
1114
+ list-style: none;
1115
+ }
1116
+ [data-bl='footer'] :where(p, h2) {
1117
+ margin: 0;
1118
+ }
1119
+ [data-bl='footer'] > [data-slot='decoration'] {
1120
+ position: absolute;
1121
+ inset: 0;
1122
+ z-index: 2;
1123
+ pointer-events: none;
1124
+ }
1125
+ [data-bl='footer'] [data-slot='panel'] {
1126
+ position: relative;
1127
+ isolation: isolate;
1128
+ }
1129
+ [data-bl='footer'] [data-slot='panel'] > [data-slot='media'] {
1130
+ position: absolute;
1131
+ inset: 0;
1132
+ z-index: -1;
1133
+ overflow: hidden;
1134
+ pointer-events: none;
1135
+ }
1136
+ [data-bl='footer'] [data-slot='panel'] > [data-slot='media'] :where(img, picture) {
1137
+ display: block;
1138
+ width: 100%;
1139
+ height: 100%;
1140
+ object-fit: cover;
1141
+ }
1142
+ [data-bl='footer'] [data-slot='inner'] {
1143
+ display: grid;
1144
+ gap: 2.5rem;
1145
+ max-width: var(--bl-container, 80rem);
1146
+ margin-inline: auto;
1147
+ padding: var(--bl-space-section, 4rem) var(--bl-gutter, 1.25rem) 3rem;
1148
+ }
1149
+ [data-bl='footer'] [data-slot='brand'] {
1150
+ display: grid;
1151
+ align-content: start;
1152
+ gap: 1.25rem;
1153
+ }
1154
+ [data-bl='footer'] [data-slot='logo'] {
1155
+ display: inline-flex;
1156
+ justify-self: start;
1157
+ }
1158
+ [data-bl='footer'] [data-slot='logo'] img {
1159
+ display: block;
1160
+ width: auto;
1161
+ height: var(--bl-footer-logo-h, 56px);
1162
+ }
1163
+ [data-bl='footer'] [data-slot='licences'] {
1164
+ display: grid;
1165
+ gap: 0.25rem;
1166
+ }
1167
+ /* WCAG 2.5.8: every footer link is at least 24 px tall without relying on the spacing exception. */
1168
+ [data-bl='footer'] [data-slot='licenceLink'] {
1169
+ display: inline-flex;
1170
+ align-items: center;
1171
+ min-height: 24px;
1172
+ }
1173
+ [data-bl='footer'] [data-slot='social'] {
1174
+ display: flex;
1175
+ flex-wrap: wrap;
1176
+ gap: 0.5rem;
1177
+ }
1178
+ [data-bl='footer'] [data-slot='socialLink'] {
1179
+ display: inline-flex;
1180
+ align-items: center;
1181
+ justify-content: center;
1182
+ width: 44px;
1183
+ height: 44px;
1184
+ }
1185
+ [data-bl='footer'] [data-slot='social'] svg {
1186
+ width: 1.05rem;
1187
+ height: 1.05rem;
1188
+ }
1189
+ [data-bl='footer'] [data-slot='contact'] {
1190
+ display: grid;
1191
+ justify-items: start;
1192
+ gap: 0.25rem;
1193
+ }
1194
+ [data-bl='footer'] [data-slot='contact'] > a {
1195
+ display: inline-flex;
1196
+ align-items: center;
1197
+ min-height: 44px;
1198
+ }
1199
+ [data-bl='footer'] [data-slot='columns'] {
1200
+ display: grid;
1201
+ gap: 2rem;
1202
+ }
1203
+ [data-bl='footer'] [data-slot='columns'][data-accordion='true'] {
1204
+ gap: 0;
1205
+ }
1206
+ [data-bl='footer'] [data-slot='column'] > [data-slot='list'] {
1207
+ display: grid;
1208
+ gap: 0.15rem;
1209
+ margin-top: 0.75rem;
1210
+ }
1211
+ [data-bl='footer'] [data-slot='column'] > [data-slot='list'] a {
1212
+ display: inline-flex;
1213
+ align-items: center;
1214
+ min-height: 32px;
1215
+ }
1216
+ [data-bl='footer'] [data-slot='toggle'] {
1217
+ display: flex;
1218
+ align-items: center;
1219
+ justify-content: space-between;
1220
+ width: 100%;
1221
+ min-height: 52px;
1222
+ padding: 0;
1223
+ border: 0;
1224
+ background: none;
1225
+ color: inherit;
1226
+ font: inherit;
1227
+ letter-spacing: inherit;
1228
+ text-align: start;
1229
+ text-transform: inherit;
1230
+ cursor: pointer;
1231
+ }
1232
+ [data-bl='footer'] [data-slot='toggle'] svg {
1233
+ width: 1.1rem;
1234
+ height: 1.1rem;
1235
+ transition: rotate 150ms ease;
1236
+ }
1237
+ [data-bl='footer'] [data-slot='toggle'][aria-expanded='true'] svg {
1238
+ rotate: 180deg;
1239
+ }
1240
+ [data-bl='footer'] [data-slot='columns'][data-accordion='true'] [data-slot='column'] > [data-slot='list'] {
1241
+ margin-top: 0;
1242
+ padding-bottom: 1rem;
1243
+ }
1244
+ [data-bl='footer'] [data-slot='bottomInner'] {
1245
+ display: flex;
1246
+ flex-wrap: wrap;
1247
+ align-items: center;
1248
+ justify-content: space-between;
1249
+ gap: 0.75rem 1.5rem;
1250
+ max-width: var(--bl-container, 80rem);
1251
+ margin-inline: auto;
1252
+ padding: 1.25rem var(--bl-gutter, 1.25rem);
1253
+ }
1254
+ /* The ABN never breaks across lines on a phone. */
1255
+ [data-bl='footer'] [data-slot='legal'] > span:not([aria-hidden]) {
1256
+ white-space: nowrap;
1257
+ }
1258
+ [data-bl='footer'] [data-slot='policies'] {
1259
+ display: flex;
1260
+ flex-wrap: wrap;
1261
+ gap: 0.25rem 1.25rem;
1262
+ }
1263
+ [data-bl='footer'] [data-slot='policyLink'] {
1264
+ display: inline-flex;
1265
+ align-items: center;
1266
+ min-height: 32px;
1267
+ }
1268
+
1269
+ @container bl-footer (min-width: 640px) {
1270
+ [data-bl='footer'] [data-slot='columns'] {
1271
+ grid-template-columns: repeat(3, minmax(0, 1fr));
1272
+ }
1273
+ }
1274
+ @container bl-footer (min-width: 1024px) {
1275
+ [data-bl='footer'] [data-slot='inner'] {
1276
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.9fr);
1277
+ gap: 4rem;
1278
+ }
1279
+ }
1280
+
1281
+ /* 33-faqs.css */
1282
+ /* Accordion and FAQs: native <details name> disclosures (one open at a time); two columns from 48rem of the section. */
1283
+
1284
+ [data-bl='accordion'] > [data-slot='item'] > [data-slot='summary'] {
1285
+ display: flex;
1286
+ align-items: center;
1287
+ justify-content: space-between;
1288
+ gap: 1rem;
1289
+ min-height: 44px;
1290
+ cursor: pointer;
1291
+ list-style: none;
1292
+ }
1293
+ [data-bl='accordion'] > [data-slot='item'] > [data-slot='summary']::-webkit-details-marker {
1294
+ display: none;
1295
+ }
1296
+ [data-bl='accordion'] [data-slot='marker'] svg {
1297
+ width: 1.25em;
1298
+ height: 1.25em;
1299
+ transition: transform 150ms ease;
1300
+ }
1301
+ [data-bl='accordion'] > [data-slot='item'][open] > [data-slot='summary'] [data-slot='marker'] svg {
1302
+ transform: rotate(180deg);
1303
+ }
1304
+
1305
+ [data-bl-section='faqs'] {
1306
+ container-type: inline-size;
1307
+ }
1308
+ [data-bl-section='faqs'] [data-slot='columns'] {
1309
+ display: grid;
1310
+ gap: 0 calc(var(--bl-gutter, 1.25rem) * 2);
1311
+ }
1312
+ @container (min-width: 48rem) {
1313
+ [data-bl-section='faqs'] [data-slot='columns'][data-columns='2'] {
1314
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1315
+ align-items: start;
1316
+ }
1317
+ }
1318
+
1319
+ /* 34-prices.css */
1320
+ /* Price table and price guide. Below 40rem of its own width the table stacks its rows; its explicit roles keep the
1321
+ table semantics, and each cell shows its column label (aria-hidden) for sighted readers. Lists styled without
1322
+ bullets carry role="list", so Safari keeps announcing them as lists. */
1323
+
1324
+ [data-bl='price-table'] {
1325
+ container-type: inline-size;
1326
+ }
1327
+ [data-bl='price-table'] > table {
1328
+ width: 100%;
1329
+ border-collapse: collapse;
1330
+ }
1331
+ [data-bl='price-table'] caption,
1332
+ [data-bl='price-table'] :where(th, td) {
1333
+ text-align: start;
1334
+ vertical-align: top;
1335
+ }
1336
+ [data-bl='price-table'] [data-slot='label'] {
1337
+ display: none;
1338
+ }
1339
+ :where([data-bl='price-table'], [data-bl-section='price-guide']) [data-slot='range'] {
1340
+ white-space: nowrap;
1341
+ }
1342
+ @container (max-width: 40rem) {
1343
+ [data-bl='price-table'] :where(table, tbody, tr, th, td) {
1344
+ display: block;
1345
+ }
1346
+ [data-bl='price-table'] thead {
1347
+ position: absolute;
1348
+ width: 1px;
1349
+ height: 1px;
1350
+ overflow: hidden;
1351
+ clip-path: inset(50%);
1352
+ white-space: nowrap;
1353
+ }
1354
+ [data-bl='price-table'] [data-slot='label'] {
1355
+ display: block;
1356
+ }
1357
+ }
1358
+
1359
+ [data-bl-section='price-guide'] :where([data-slot='cards'], [data-slot='bands']) {
1360
+ margin: 0;
1361
+ padding: 0;
1362
+ list-style: none;
1363
+ }
1364
+ [data-bl-section='price-guide'] [data-slot='cards'] {
1365
+ display: grid;
1366
+ gap: var(--bl-gutter, 1.25rem);
1367
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 16rem), 1fr));
1368
+ }
1369
+ [data-bl-section='price-guide'] [data-slot='bands'] {
1370
+ display: grid;
1371
+ gap: 0.75rem;
1372
+ }
1373
+ [data-bl-section='price-guide'] [data-slot='band'] {
1374
+ display: flex;
1375
+ flex-wrap: wrap;
1376
+ align-items: baseline;
1377
+ justify-content: space-between;
1378
+ gap: 0.25rem 1rem;
1379
+ }
1380
+ [data-bl-section='price-guide'] [data-slot='band'] > :where([data-slot='includes'], [data-slot='excludes']) {
1381
+ flex-basis: 100%;
1382
+ }
1383
+
1384
+ /* 35-proof.css */
1385
+ /* Proof strip: one wrapping row (inline) or a grid of tiles. */
1386
+
1387
+ [data-bl-section='proof-strip'] [data-slot='list'] {
1388
+ margin: 0;
1389
+ padding: 0;
1390
+ list-style: none;
1391
+ display: flex;
1392
+ flex-wrap: wrap;
1393
+ align-items: center;
1394
+ gap: 0.75rem 2rem;
1395
+ }
1396
+ [data-bl-section='proof-strip'][data-variant='tiles'] [data-slot='list'] {
1397
+ display: grid;
1398
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 11rem), 1fr));
1399
+ align-items: stretch;
1400
+ gap: var(--bl-gutter, 1.25rem);
1401
+ }
1402
+ [data-bl-section='proof-strip'] [data-slot='item'] {
1403
+ display: flex;
1404
+ flex-wrap: wrap;
1405
+ align-items: center;
1406
+ gap: 0.25rem 0.5rem;
1407
+ }
1408
+ [data-bl-section='proof-strip'] [data-slot='icon'] svg {
1409
+ width: 1.5em;
1410
+ height: 1.5em;
1411
+ }
1412
+ [data-bl-section='proof-strip'] [data-slot='logos'] {
1413
+ margin-top: 1.5rem;
1414
+ }
1415
+
1416
+ /* 36-page-header.css */
1417
+ /* Page header. The photo variant puts the site's image and its scrim behind the text, edge to edge. */
1418
+
1419
+ [data-bl-section='page-header'][data-variant='photo'] {
1420
+ isolation: isolate;
1421
+ overflow: hidden;
1422
+ }
1423
+ [data-bl-section='page-header'][data-variant='photo'] > [data-slot='inner'] {
1424
+ position: static;
1425
+ }
1426
+ [data-bl-section='page-header'] :where([data-slot='media'], [data-slot='scrim']) {
1427
+ position: absolute;
1428
+ inset: 0;
1429
+ z-index: -1;
1430
+ }
1431
+ [data-bl-section='page-header'] [data-slot='media'] :where(img, picture, video) {
1432
+ width: 100%;
1433
+ height: 100%;
1434
+ object-fit: cover;
1435
+ }
1436
+
1437
+ /* 37-contact.css */
1438
+ /* Contact block: the form and the details side by side from 48rem of the section (form at the start by default). */
1439
+
1440
+ [data-bl-section='contact'] {
1441
+ container-type: inline-size;
1442
+ }
1443
+ [data-bl-section='contact'] > [data-slot='inner'] {
1444
+ display: grid;
1445
+ gap: calc(var(--bl-gutter, 1.25rem) * 2);
1446
+ }
1447
+ [data-bl-section='contact'] [data-slot='list'] {
1448
+ margin: 0;
1449
+ }
1450
+ [data-bl-section='contact'] [data-slot='value'] {
1451
+ margin: 0 0 1rem;
1452
+ }
1453
+ [data-bl-section='contact'] [data-slot='line'] {
1454
+ display: block;
1455
+ }
1456
+ @container (min-width: 48rem) {
1457
+ [data-bl-section='contact'] > [data-slot='inner'] {
1458
+ grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
1459
+ align-items: start;
1460
+ }
1461
+ [data-bl-section='contact'][data-form-side='end'] > [data-slot='inner'] {
1462
+ grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
1463
+ }
1464
+ [data-bl-section='contact'][data-form-side='end'] [data-slot='form'] {
1465
+ order: 2;
1466
+ }
1467
+ }
1468
+
1469
+ /* 38-sequence.css */
1470
+ /* Section tones assigned by SectionSequence, from the site's tokens. The photo tone takes its look from its image. */
1471
+
1472
+ [data-bl-section][data-tone='canvas'] {
1473
+ background-color: var(--bl-color-canvas, transparent);
1474
+ }
1475
+ [data-bl-section][data-tone='surface'] {
1476
+ background-color: var(--bl-color-surface, transparent);
1477
+ }
1478
+ [data-bl-section][data-tone='band'] {
1479
+ background-color: var(--bl-color-band, transparent);
1480
+ color: var(--bl-color-on-band, inherit);
1481
+ }
1482
+
717
1483
  }