@hawiyah/styles 0.0.0-stage → 0.2.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 (135) hide show
  1. package/LICENSE +73 -0
  2. package/NOTICE +34 -0
  3. package/README.md +246 -2
  4. package/dist/accordion-motion.css +18 -0
  5. package/dist/assets/external-link.svg +1 -0
  6. package/dist/assets/favicon.svg +4 -0
  7. package/dist/assets/fonts/riyal-LICENSE.txt +93 -0
  8. package/dist/assets/fonts/riyal-provenance.json +47 -0
  9. package/dist/assets/fonts/riyal.woff2 +0 -0
  10. package/dist/assets/hawiyah-loader-256.gif +0 -0
  11. package/dist/assets/hawiyah-loader-white-256.gif +0 -0
  12. package/dist/assets/hawiyah-loader-white.gif +0 -0
  13. package/dist/assets/hawiyah-loader.gif +0 -0
  14. package/dist/assets/hawiyah-lockup-ar-mono.svg +4 -0
  15. package/dist/assets/hawiyah-lockup-ar-reverse.svg +4 -0
  16. package/dist/assets/hawiyah-lockup-ar-white.svg +4 -0
  17. package/dist/assets/hawiyah-lockup-ar.svg +4 -0
  18. package/dist/assets/hawiyah-lockup-bilingual-mono.svg +4 -0
  19. package/dist/assets/hawiyah-lockup-bilingual-reverse.svg +4 -0
  20. package/dist/assets/hawiyah-lockup-bilingual-white.svg +4 -0
  21. package/dist/assets/hawiyah-lockup-bilingual.svg +4 -0
  22. package/dist/assets/hawiyah-lockup-en-mono.svg +4 -0
  23. package/dist/assets/hawiyah-lockup-en-reverse.svg +4 -0
  24. package/dist/assets/hawiyah-lockup-en-white.svg +4 -0
  25. package/dist/assets/hawiyah-lockup-en.svg +4 -0
  26. package/dist/assets/hawiyah-pattern.svg +4 -0
  27. package/dist/assets/hawiyah-symbol-mono.svg +4 -0
  28. package/dist/assets/hawiyah-symbol-reverse.svg +4 -0
  29. package/dist/assets/hawiyah-symbol-white.svg +4 -0
  30. package/dist/assets/hawiyah-symbol.svg +4 -0
  31. package/dist/assets/hawiyah-wordmark-loader-256.gif +0 -0
  32. package/dist/assets/hawiyah-wordmark-loader-white-256.gif +0 -0
  33. package/dist/assets/hawiyah-wordmark-loader-white.gif +0 -0
  34. package/dist/assets/hawiyah-wordmark-loader.gif +0 -0
  35. package/dist/assets/hawiyah-wordmark-mono.svg +4 -0
  36. package/dist/assets/hawiyah-wordmark-reverse.svg +4 -0
  37. package/dist/assets/hawiyah-wordmark-white.svg +4 -0
  38. package/dist/assets/hawiyah-wordmark.svg +4 -0
  39. package/dist/assets/icons/LICENSE +21 -0
  40. package/dist/assets/icons/add-01.svg +4 -0
  41. package/dist/assets/icons/alert-02.svg +5 -0
  42. package/dist/assets/icons/arrow-data-transfer-vertical.svg +4 -0
  43. package/dist/assets/icons/arrow-down-01.svg +3 -0
  44. package/dist/assets/icons/arrow-down-02.svg +4 -0
  45. package/dist/assets/icons/arrow-left-01.svg +3 -0
  46. package/dist/assets/icons/arrow-left-02.svg +4 -0
  47. package/dist/assets/icons/arrow-right-01.svg +3 -0
  48. package/dist/assets/icons/arrow-right-02.svg +4 -0
  49. package/dist/assets/icons/arrow-up-01.svg +3 -0
  50. package/dist/assets/icons/arrow-up-02.svg +4 -0
  51. package/dist/assets/icons/arrow-up-right-01.svg +3 -0
  52. package/dist/assets/icons/calendar-03.svg +6 -0
  53. package/dist/assets/icons/cancel-01.svg +3 -0
  54. package/dist/assets/icons/cancel-circle.svg +4 -0
  55. package/dist/assets/icons/checkmark-circle-02.svg +4 -0
  56. package/dist/assets/icons/exclamation-mark.svg +4 -0
  57. package/dist/assets/icons/filter-horizontal.svg +8 -0
  58. package/dist/assets/icons/home-01.svg +3 -0
  59. package/dist/assets/icons/information-circle.svg +5 -0
  60. package/dist/assets/icons/link-04.svg +4 -0
  61. package/dist/assets/icons/link-square-02.svg +4 -0
  62. package/dist/assets/icons/lock-password.svg +7 -0
  63. package/dist/assets/icons/menu-01.svg +5 -0
  64. package/dist/assets/icons/minus-sign-circle.svg +4 -0
  65. package/dist/assets/icons/minus-sign.svg +3 -0
  66. package/dist/assets/icons/provenance.json +403 -0
  67. package/dist/assets/icons/search-01.svg +4 -0
  68. package/dist/assets/icons/sorting-05.svg +8 -0
  69. package/dist/assets/icons/star.svg +3 -0
  70. package/dist/assets/icons/thumbs-down.svg +4 -0
  71. package/dist/assets/icons/thumbs-up.svg +4 -0
  72. package/dist/assets/icons/tick-02.svg +3 -0
  73. package/dist/assets/icons/view-off-slash.svg +5 -0
  74. package/dist/assets/icons/view.svg +4 -0
  75. package/dist/assets/notifications/danger-outline.svg +3 -0
  76. package/dist/assets/notifications/danger.svg +4 -0
  77. package/dist/assets/notifications/info-outline.svg +3 -0
  78. package/dist/assets/notifications/info.svg +4 -0
  79. package/dist/assets/notifications/neutral-outline.svg +3 -0
  80. package/dist/assets/notifications/neutral.svg +4 -0
  81. package/dist/assets/notifications/success-outline.svg +3 -0
  82. package/dist/assets/notifications/success.svg +4 -0
  83. package/dist/assets/notifications/warning-outline.svg +3 -0
  84. package/dist/assets/notifications/warning.svg +4 -0
  85. package/dist/assets/pagination-arrow.svg +1 -0
  86. package/dist/assets/select-down.svg +4 -0
  87. package/dist/assets/select-up.svg +4 -0
  88. package/dist/brand-loader.css +12 -0
  89. package/dist/components.css +335 -0
  90. package/dist/content-navigation.css +44 -0
  91. package/dist/date-picker.css +50 -0
  92. package/dist/dga.css +316 -0
  93. package/dist/direction.css +14 -0
  94. package/dist/extended.css +310 -0
  95. package/dist/feedback.css +48 -0
  96. package/dist/file-upload-list.css +64 -0
  97. package/dist/icons.css +67 -0
  98. package/dist/layout.css +129 -0
  99. package/dist/link-composition.css +10 -0
  100. package/dist/mobile-navigation.css +43 -0
  101. package/dist/mobile-top-bar.css +15 -0
  102. package/dist/navigation-drawer.css +104 -0
  103. package/dist/nic-accordion.css +97 -0
  104. package/dist/nic-avatars.css +33 -0
  105. package/dist/nic-badges.css +56 -0
  106. package/dist/nic-buttons.css +80 -0
  107. package/dist/nic-cards.css +77 -0
  108. package/dist/nic-carousel.css +77 -0
  109. package/dist/nic-choices.css +64 -0
  110. package/dist/nic-footer.css +73 -0
  111. package/dist/nic-foundations.css +115 -0
  112. package/dist/nic-icons.css +72 -0
  113. package/dist/nic-input-groups.css +35 -0
  114. package/dist/nic-links.css +61 -0
  115. package/dist/nic-lists.css +68 -0
  116. package/dist/nic-notification-dialog.css +115 -0
  117. package/dist/nic-notifications.css +126 -0
  118. package/dist/nic-pagination.css +73 -0
  119. package/dist/nic-rating.css +53 -0
  120. package/dist/nic-search.css +70 -0
  121. package/dist/nic-segmented.css +117 -0
  122. package/dist/nic-select.css +51 -0
  123. package/dist/nic-tables.css +68 -0
  124. package/dist/nic-tabs.css +86 -0
  125. package/dist/password-field.css +16 -0
  126. package/dist/portal-branches.css +52 -0
  127. package/dist/portal.css +24 -0
  128. package/dist/reset.css +12 -0
  129. package/dist/riyal.css +32 -0
  130. package/dist/search-field.css +11 -0
  131. package/dist/site-verification.css +36 -0
  132. package/dist/stepper.css +46 -0
  133. package/dist/styles.css +49 -0
  134. package/dist/tooltip-placement.css +65 -0
  135. package/package.json +51 -3
@@ -0,0 +1,77 @@
1
+ /* NIC global.css 1565–1641, snapshot hash in docs/nic-web-reference.md.
2
+ Shared CSS preserves adapter-owned markup and the original theme. */
3
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
4
+ --hw-profile-card-padding: 1rem;
5
+ --hw-profile-card-gap: 1.5rem;
6
+ --hw-profile-card-border: 2px solid transparent;
7
+ --hw-profile-card-shadow: var(--hw-shadow-md);
8
+ --hw-profile-card-slot-padding: 0px;
9
+ --hw-profile-card-footer-border: 0px;
10
+ --hw-profile-card-heading-weight: 700;
11
+ --hw-profile-card-heading-leading: 1.75rem;
12
+ }
13
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
14
+ --hw-profile-card-padding: initial;
15
+ --hw-profile-card-gap: initial;
16
+ --hw-profile-card-border: initial;
17
+ --hw-profile-card-shadow: initial;
18
+ --hw-profile-card-slot-padding: initial;
19
+ --hw-profile-card-footer-border: initial;
20
+ --hw-profile-card-heading-weight: initial;
21
+ --hw-profile-card-heading-leading: initial;
22
+ }
23
+ @media (max-width: 767px) {
24
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
25
+ --hw-profile-card-gap: 1rem;
26
+ }
27
+ }
28
+ .hw-card {
29
+ display: flex;
30
+ flex-direction: column;
31
+ position: relative;
32
+ padding: var(--hw-profile-card-padding, 0px);
33
+ gap: var(--hw-profile-card-gap, 0px);
34
+ border: var(--hw-profile-card-border, 1px solid var(--hw-color-border));
35
+ background: var(--hw-color-card);
36
+ color: var(--hw-color-card-text);
37
+ box-shadow: var(--hw-profile-card-shadow, var(--hw-shadow-sm));
38
+ }
39
+ .hw-card-header { padding: var(--hw-profile-card-slot-padding, var(--hw-space-5) var(--hw-space-5) 0); }
40
+ .hw-card-body { min-inline-size: 0; padding: var(--hw-profile-card-slot-padding, var(--hw-space-5)); }
41
+ .hw-card-footer {
42
+ padding: var(--hw-profile-card-slot-padding, var(--hw-space-4) var(--hw-space-5));
43
+ border-block-start: var(--hw-profile-card-footer-border, 1px solid var(--hw-color-border));
44
+ }
45
+ .hw-card > :is(.hw-card-header, .hw-card-footer):empty { display: none; }
46
+ .hw-card-title, .hw-card-header :where(h2, h3, h4) {
47
+ margin: 0;
48
+ color: inherit;
49
+ font-size: var(--hw-text-lg);
50
+ font-weight: var(--hw-profile-card-heading-weight, var(--hw-weight-semibold));
51
+ line-height: var(--hw-profile-card-heading-leading, var(--hw-leading-heading));
52
+ }
53
+ .hw-card-description, .hw-card-description p {
54
+ margin: 0;
55
+ padding: 0;
56
+ color: inherit;
57
+ font-size: var(--hw-text-md);
58
+ font-weight: 400;
59
+ line-height: 1.5;
60
+ }
61
+ .hw-card-image { display: block; max-inline-size: 100%; inline-size: 100%; block-size: auto; border-radius: var(--hw-radius-lg); }
62
+ .hw-card[data-variant='outlined'] { border: 1px solid var(--hw-color-card-border); box-shadow: none; }
63
+ .hw-card[data-variant='flat'] { box-shadow: none; }
64
+ .hw-card[data-variant='ghost'] { background: transparent; border-color: transparent; box-shadow: none; }
65
+ .hw-card-action { text-decoration: none; cursor: pointer; }
66
+ .hw-card-action:hover:not([aria-disabled='true'], :disabled) { background: var(--hw-color-card-hover); color: var(--hw-color-card-text); text-decoration: none; }
67
+ .hw-card-action:focus:not([aria-disabled='true'], :disabled) { outline: 2px solid var(--hw-color-focus-contrast); outline-offset: 0; background: var(--hw-color-card); }
68
+ .hw-card:is([data-disabled='true'], [aria-disabled='true'], :disabled) { background: var(--hw-color-disabled); border: 0; box-shadow: none; cursor: not-allowed; }
69
+ @media (max-width: 40rem) {
70
+ .hw-card-header { padding-inline: var(--hw-profile-card-slot-padding, var(--hw-space-4)); }
71
+ .hw-card-body, .hw-card-footer { padding-inline: var(--hw-profile-card-slot-padding, var(--hw-space-4)); }
72
+ }
73
+ @media (forced-colors: active) {
74
+ .hw-card { border: 1px solid CanvasText; }
75
+ .hw-card-action:focus { outline: 2px solid Highlight; }
76
+ .hw-card:is([aria-disabled='true'], :disabled) { color: GrayText; border-color: GrayText; }
77
+ }
@@ -0,0 +1,77 @@
1
+ /* NIC global.css 3279–3423. Source behavior and accessibility adaptations are
2
+ documented in docs/nic-carousel.md. No autoplay or external icon font. */
3
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
4
+ --hw-profile-carousel-arrow-size: 45px;
5
+ --hw-profile-carousel-arrow-radius: 50%;
6
+ }
7
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
8
+ --hw-profile-carousel-arrow-size: initial;
9
+ --hw-profile-carousel-arrow-radius: initial;
10
+ }
11
+ .hw-carousel[data-hw-carousel-ready] { padding-block-end: 4rem; }
12
+ .hw-carousel-viewport { overflow: hidden; padding-block: .5rem; }
13
+ .hw-carousel-track {
14
+ display: flex; gap: var(--hw-carousel-gap, 1rem); inline-size: 100%;
15
+ transform: translateX(calc(-1 * var(--_hw-inline-sign, 1) * var(--hw-carousel-index, 0) * (100% + var(--hw-carousel-gap, 1rem))));
16
+ transition: transform var(--hw-duration-carousel) var(--hw-ease-carousel);
17
+ }
18
+ .hw-carousel-track > .hw-carousel-slide { box-sizing: border-box; flex: 0 0 100%; inline-size: 100%; visibility: visible; transition: visibility 0s; }
19
+ /* hidden is retained as the no-CSS/no-enhancement fallback. In track mode the
20
+ inactive panel occupies space, but inert and aria-hidden protect interaction
21
+ immediately. Delayed visibility lets the outgoing panel finish sliding. */
22
+ .hw-carousel[data-hw-carousel-ready] > .hw-carousel-viewport > .hw-carousel-track > .hw-carousel-slide[hidden] { display: block !important; }
23
+ .hw-carousel-track > .hw-carousel-slide[aria-hidden='true'] { visibility: hidden; transition: visibility 0s linear var(--hw-duration-carousel); }
24
+ .hw-carousel[data-hw-carousel-ready] > .hw-carousel-controls {
25
+ position: absolute; inset-inline: 0; inset-block-end: 0; margin: 0;
26
+ padding-inline: 1rem; display: flex; flex-wrap: wrap; align-items: center;
27
+ justify-content: space-between; gap: .75rem;
28
+ }
29
+ .hw-carousel-arrows { display: flex; flex: none; gap: .75rem; margin-inline-start: auto; }
30
+ .hw-carousel-empty { margin: 0; padding: var(--hw-space-5); color: var(--hw-color-text-muted); }
31
+ .hw-button.hw-carousel-arrow {
32
+ inline-size: var(--hw-profile-carousel-arrow-size, var(--hw-control-height));
33
+ min-inline-size: var(--hw-profile-carousel-arrow-size, var(--hw-control-height));
34
+ block-size: var(--hw-profile-carousel-arrow-size, var(--hw-control-height));
35
+ min-block-size: var(--hw-profile-carousel-arrow-size, var(--hw-control-height));
36
+ padding: 0; border: 0; border-radius: var(--hw-profile-carousel-arrow-radius, var(--hw-radius-md));
37
+ background: var(--hw-color-primary); color: var(--hw-color-on-primary);
38
+ transition: background-color var(--hw-duration-carousel-control) ease;
39
+ }
40
+ .hw-button.hw-carousel-arrow:hover:not(:disabled) { background: var(--hw-color-primary-hover); }
41
+ .hw-button.hw-carousel-arrow:active:not(:disabled) { background: var(--hw-color-primary-active); }
42
+ .hw-button.hw-carousel-arrow:disabled { opacity: .3; cursor: not-allowed; }
43
+ .hw-carousel-arrow::before { content: ''; inline-size: 20px; block-size: 20px; background: currentColor; mask: url('./assets/icons/arrow-right-02.svg') center / contain no-repeat; transform: scaleX(var(--_hw-inline-sign, 1)); }
44
+ .hw-carousel-arrow[data-hw-previous]::before { mask-image: url('./assets/icons/arrow-left-02.svg'); }
45
+ .hw-carousel-pagination { display: flex; flex-wrap: wrap; align-items: center; gap: .1rem; }
46
+ /* 12px source dots sit inside 24px targets; the 1px boundary keeps unselected
47
+ controls recognizable against the surface without changing their fill. */
48
+ .hw-carousel-dot {
49
+ display: inline-grid; place-items: center; flex: none; box-sizing: border-box;
50
+ inline-size: 24px; block-size: 24px; min-inline-size: 24px; padding: 0;
51
+ border: 0; border-radius: 50%; background: transparent; cursor: pointer;
52
+ }
53
+ .hw-carousel-dot::before {
54
+ content: ''; display: block; inline-size: 12px; block-size: 12px;
55
+ border: 1px solid var(--hw-color-carousel-dot-border); border-radius: 50%;
56
+ background: var(--hw-color-carousel-dot);
57
+ transition: background-color var(--hw-duration-carousel-control) ease, transform var(--hw-duration-carousel-control) ease;
58
+ }
59
+ .hw-carousel-dot:hover:where(:not(:disabled))::before { background: var(--hw-color-carousel-dot-hover); }
60
+ .hw-carousel-dot[aria-current='true']::before { background: var(--hw-color-primary); border-color: var(--hw-color-primary); transform: scale(1.3); }
61
+ .hw-carousel-dot:disabled { cursor: not-allowed; opacity: .3; }
62
+ .hw-carousel-dot:focus-visible { outline: var(--hw-focus-width) solid var(--hw-color-focus); outline-offset: 2px; }
63
+ /* Many indicators may wrap; keep controls in flow rather than overlap content. */
64
+ .hw-carousel[data-hw-carousel-ready]:has(.hw-carousel-dot:nth-child(n + 7)) { padding-block-end: 0; }
65
+ .hw-carousel[data-hw-carousel-ready]:has(.hw-carousel-dot:nth-child(n + 7)) > .hw-carousel-controls { position: static; margin-block-start: .75rem; }
66
+ @media (max-width: 25rem) {
67
+ .hw-carousel[data-hw-carousel-ready] { padding-block-end: 0; }
68
+ .hw-carousel[data-hw-carousel-ready] > .hw-carousel-controls { position: static; margin-block-start: .75rem; padding-inline: .25rem; }
69
+ }
70
+ @media (prefers-reduced-motion: reduce) {
71
+ .hw-carousel-track, .hw-carousel-track > .hw-carousel-slide[aria-hidden], .hw-carousel-dot::before, .hw-button.hw-carousel-arrow { transition: none; }
72
+ }
73
+ @media (forced-colors: active) {
74
+ .hw-button.hw-carousel-arrow { border: 1px solid ButtonText; }
75
+ .hw-carousel-dot::before { background: Canvas; border-color: ButtonText; forced-color-adjust: none; }
76
+ .hw-carousel-dot[aria-current='true']::before { background: Highlight; border-color: Highlight; }
77
+ }
@@ -0,0 +1,64 @@
1
+ /* NIC global.css 2729–3009. Native form controls retain their semantics.
2
+ Theme switches preserve the original theme; system colors use native widgets. */
3
+ .hw-choice:has(> :is(.hw-checkbox, .hw-radio)) {
4
+ gap: var(--hw-dga-on, var(--hw-space-3)) var(--hw-dga-off, 1rem);
5
+ }
6
+ :is(.hw-checkbox, .hw-radio) {
7
+ appearance: var(--hw-dga-on, auto) var(--hw-dga-off, none);
8
+ position: relative;
9
+ display: inline-grid;
10
+ place-content: center;
11
+ padding: 0;
12
+ border: var(--hw-dga-on, revert) var(--hw-dga-off, 1px solid var(--hw-color-border-strong));
13
+ background: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-surface));
14
+ color: var(--hw-color-on-primary);
15
+ border-radius: 0;
16
+ --hw-choice-mark: var(--hw-color-primary);
17
+ }
18
+ .hw-radio { border-radius: 50%; }
19
+ label:has(> :is(.hw-checkbox, .hw-radio)) { position: relative; isolation: isolate; }
20
+ :is(.hw-checkbox, .hw-radio)::after {
21
+ content: var(--hw-dga-on, none) var(--hw-dga-off, '');
22
+ position: absolute;
23
+ inline-size: 40px;
24
+ block-size: 40px;
25
+ inset-block-start: calc(50% - 20px);
26
+ inset-inline-start: auto;
27
+ left: calc(50% - 20px);
28
+ z-index: -1;
29
+ border-radius: 50%;
30
+ background: var(--hw-color-surface-muted);
31
+ transform: scale(0);
32
+ transition: transform var(--hw-duration-choice-halo, 300ms) ease-in-out;
33
+ pointer-events: none;
34
+ }
35
+ :is(.hw-checkbox, .hw-radio):hover:not(:disabled, [readonly], [aria-disabled='true'])::after { transform: scale(1); }
36
+ :is(.hw-checkbox, .hw-radio):hover:not(:disabled, [readonly], [aria-disabled='true']) { background: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-canvas)); }
37
+ .hw-checkbox:is(:checked, :indeterminate) { background: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-primary)); border-color: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-primary)); }
38
+ .hw-checkbox:is(:checked, :indeterminate):hover:not(:disabled, [readonly], [aria-disabled='true']) { background: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-primary)); }
39
+ :is(.hw-checkbox, .hw-radio)::before {
40
+ content: var(--hw-dga-on, none) var(--hw-dga-off, '');
41
+ visibility: hidden;
42
+ }
43
+ .hw-checkbox::before { inline-size: 14px; block-size: 14px; background: currentColor; mask: url('./assets/icons/tick-02.svg') center / contain no-repeat; }
44
+ .hw-checkbox:indeterminate::before { mask-image: url('./assets/icons/minus-sign.svg'); }
45
+ .hw-radio::before { inline-size: 12px; block-size: 12px; border-radius: 50%; background: var(--hw-choice-mark); }
46
+ :is(.hw-checkbox, .hw-radio):is(:checked, :indeterminate)::before { visibility: visible; }
47
+ :is(.hw-checkbox, .hw-radio):active:not(:disabled, [readonly], [aria-disabled='true']) { border-color: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-choice-active)); --hw-choice-mark: var(--hw-color-choice-active); }
48
+ .hw-checkbox:active:not(:disabled, [readonly], [aria-disabled='true']) { background: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-surface-muted)); }
49
+ .hw-checkbox:is(:checked, :indeterminate):active:not(:disabled, [readonly], [aria-disabled='true']) { background: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-choice-active)); }
50
+ :is(.hw-checkbox, .hw-radio):is(:disabled, [readonly], [aria-disabled='true']) {
51
+ opacity: var(--hw-dga-on, 0.6) var(--hw-dga-off, 1);
52
+ background: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-surface));
53
+ border-color: var(--hw-dga-on, revert) var(--hw-dga-off, var(--hw-color-border));
54
+ color: var(--hw-color-primary-text);
55
+ cursor: default;
56
+ }
57
+ :is(.hw-checkbox, .hw-radio):disabled { color: var(--hw-color-border); --hw-choice-mark: var(--hw-color-border); cursor: not-allowed; }
58
+ :is(.hw-checkbox, .hw-radio):focus-visible { outline: var(--hw-dga-on, var(--hw-focus-width) solid var(--hw-color-focus)) var(--hw-dga-off, 2px solid var(--hw-color-focus-contrast)); outline-offset: 2px; }
59
+ @media (prefers-reduced-motion: reduce) { :is(.hw-checkbox, .hw-radio)::after { transition: none; } }
60
+ @media (forced-colors: active) {
61
+ :is(.hw-checkbox, .hw-radio) { appearance: auto; forced-color-adjust: auto; }
62
+ :is(.hw-checkbox, .hw-radio)::before, :is(.hw-checkbox, .hw-radio)::after { content: none; }
63
+ :is(.hw-checkbox, .hw-radio):focus-visible { outline: 2px solid Highlight; }
64
+ }
@@ -0,0 +1,73 @@
1
+ /* NIC global.css 3215–3275; existing DGA footer colors remain semantic.
2
+ Host-owned routes, social actions and licensed partner artwork are slots. */
3
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
4
+ --hw-profile-footer-title-weight: 500;
5
+ --hw-profile-footer-title-gap: 0.5rem;
6
+ --hw-profile-footer-title-border: 1px;
7
+ --hw-profile-footer-link-gap: 0.5rem;
8
+ --hw-profile-footer-bottom-gap: 3rem;
9
+ --hw-profile-footer-row-gap: 0px;
10
+ --hw-profile-footer-link-hover-opacity: 0.8;
11
+ }
12
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
13
+ --hw-profile-footer-title-weight: initial;
14
+ --hw-profile-footer-title-gap: initial;
15
+ --hw-profile-footer-title-border: initial;
16
+ --hw-profile-footer-link-gap: initial;
17
+ --hw-profile-footer-bottom-gap: initial;
18
+ --hw-profile-footer-row-gap: initial;
19
+ --hw-profile-footer-link-hover-opacity: initial;
20
+ }
21
+ /* The source's 80% white is too faint on the brighter DGA dark footer.
22
+ Keep full foreground contrast in dark mode and caller-defined palettes. */
23
+ :where([data-hw-mode='dark'], [data-hw-theme='custom']) { --hw-profile-footer-link-hover-opacity: 1; }
24
+ .hw-portal-footer { row-gap: var(--hw-profile-footer-row-gap, var(--hw-space-8)); }
25
+ .hw-portal-footer .hw-portal-footer-main { margin-inline: auto; max-inline-size: var(--hw-content-max); }
26
+ .hw-portal-footer :is(.hw-portal-footer-group, .hw-portal-footer-support) { display: block; min-inline-size: 0; }
27
+ .hw-portal-footer :is(.hw-portal-footer-group, .hw-portal-footer-support) > h2 {
28
+ margin: 0 0 var(--hw-profile-footer-title-gap, var(--hw-space-4));
29
+ padding-block-end: var(--hw-profile-footer-title-gap, 0px);
30
+ border-block-end: var(--hw-profile-footer-title-border, 0px) solid color-mix(in srgb, currentColor 30%, transparent);
31
+ color: inherit;
32
+ font-size: 1rem;
33
+ line-height: 1.5rem;
34
+ font-weight: var(--hw-profile-footer-title-weight, var(--hw-weight-semibold));
35
+ }
36
+ .hw-portal-footer .hw-portal-footer-links { display: flex; flex-direction: column; align-items: start; gap: var(--hw-profile-footer-link-gap, var(--hw-space-3)); margin: 0; padding: 0; list-style: none; }
37
+ .hw-portal-footer :is(.hw-portal-footer-group, .hw-portal-footer-legal, .hw-portal-footer-support) a:not(.hw-button) {
38
+ color: inherit;
39
+ font-size: 0.875rem;
40
+ line-height: 1.25rem;
41
+ text-decoration: none;
42
+ text-underline-offset: 0.2em;
43
+ overflow-wrap: anywhere;
44
+ }
45
+ .hw-portal-footer :is(.hw-portal-footer-group, .hw-portal-footer-legal, .hw-portal-footer-support) a:not(.hw-button):hover { color: inherit; text-decoration: underline; opacity: var(--hw-profile-footer-link-hover-opacity, 1); }
46
+ .hw-portal-footer a:focus-visible, .hw-portal-footer button:focus-visible { outline: 2px solid currentColor; outline-offset: 4px; opacity: 1; }
47
+ .hw-portal-footer-brand { display: grid; align-content: start; gap: var(--hw-space-4); }
48
+ .hw-portal-footer-brand :is(p, strong) { margin: 0; color: inherit; }
49
+ .hw-portal-footer-brand p { max-inline-size: 38ch; font-size: 0.875rem; line-height: 1.5rem; }
50
+ .hw-portal-footer-brand-marks, .hw-portal-footer-partners { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hw-space-4); }
51
+ .hw-portal-footer :is(.hw-portal-footer-brand-marks, .hw-portal-footer-partners) :is(img, svg) { display: block; block-size: 2.625rem; inline-size: auto; max-inline-size: 100%; object-fit: contain; }
52
+ .hw-portal-footer-support-content { display: grid; gap: var(--hw-space-3); }
53
+ .hw-portal-footer-support-content > p { margin: 0; font-size: 0.875rem; line-height: 1.5rem; }
54
+ .hw-portal-footer-actions { display: flex; align-items: center; flex-wrap: wrap; gap: var(--hw-space-2); }
55
+ .hw-portal-footer-actions .hw-button[data-variant='outline-white']:not(:disabled, [disabled], [aria-disabled='true']) { --hw-button-hover: color-mix(in srgb, currentColor 20%, transparent); --hw-button-active: color-mix(in srgb, currentColor 30%, transparent); --hw-button-focus-color: currentColor; color: inherit; border-color: currentColor; }
56
+ :is(.hw-portal-wordmark, .hw-portal-footer-wordmark) { display: inline-block; inline-size: 5.25rem; block-size: 2.625rem; background: currentColor; -webkit-mask: url('./assets/hawiyah-wordmark.svg') center / contain no-repeat; mask: url('./assets/hawiyah-wordmark.svg') center / contain no-repeat; }
57
+ .hw-portal-footer .hw-portal-footer-bottom { margin-block-start: var(--hw-profile-footer-bottom-gap, var(--hw-space-6)); margin-inline: auto; max-inline-size: var(--hw-content-max); border-block-start-color: color-mix(in srgb, currentColor 30%, transparent); }
58
+ .hw-portal-footer .hw-portal-footer-bottom :is(p, small) { color: inherit; }
59
+ .hw-portal-footer .hw-portal-footer-legal > ul { flex-direction: row; flex-wrap: wrap; gap: var(--hw-space-3) var(--hw-space-4); }
60
+ .hw-portal-footer-external { display: inline; margin-inline-start: 0.25em; }
61
+ /* Angular projection containers disappear when their application-owned slot is empty. */
62
+ .hw-portal-footer :is(.hw-portal-footer-brand-marks, .hw-portal-footer-extra, .hw-portal-footer-partners):empty,
63
+ .hw-portal-footer-brand:has(> .hw-portal-footer-brand-marks:empty):not(:has(> strong, > p)),
64
+ .hw-portal-footer-support:has(> .hw-portal-footer-support-content:empty),
65
+ .hw-portal-footer-bottom:not(:has(> small, > p, > nav, > .hw-portal-footer-partners:not(:empty))) { display: none; }
66
+ @media (forced-colors: active) {
67
+ .hw-portal-footer { background: Canvas; color: CanvasText; --hw-profile-footer-link-hover-opacity: 1; }
68
+ .hw-portal-footer :is(.hw-portal-footer-group, .hw-portal-footer-support) > h2, .hw-portal-footer .hw-portal-footer-bottom { border-color: CanvasText; }
69
+ .hw-portal-footer :is(.hw-portal-footer-group, .hw-portal-footer-legal, .hw-portal-footer-support) a:not(.hw-button) { color: LinkText; }
70
+ .hw-portal-footer a:hover { opacity: 1; }
71
+ .hw-portal-footer :is(a, button):focus-visible { outline-color: Highlight; }
72
+ :is(.hw-portal-wordmark, .hw-portal-footer-wordmark) { forced-color-adjust: none; background: CanvasText; }
73
+ }
@@ -0,0 +1,115 @@
1
+ /* NIC global.css 427–606. Visual scale is independent of heading semantics. */
2
+ .hw-type {
3
+ font-family: var(--hw-font-sans);
4
+ font-size: var(--_hw-type-size, var(--hw-text-md));
5
+ line-height: var(--_hw-type-leading, 1.5);
6
+ font-weight: var(--hw-type-weight, var(--_hw-type-weight, var(--hw-weight-regular)));
7
+ margin-block: 0 var(--hw-type-spacing, var(--_hw-type-spacing, 0));
8
+ }
9
+ .hw-type[data-scale='display-2xl'] {
10
+ --_hw-type-size: var(--hw-text-7xl);
11
+ --_hw-type-leading: calc(90 / 72);
12
+ --_hw-type-weight: var(--hw-weight-bold);
13
+ --_hw-type-spacing: 2.375rem;
14
+ }
15
+ .hw-type[data-scale='display-xl'] {
16
+ --_hw-type-size: var(--hw-text-6xl);
17
+ --_hw-type-leading: calc(72 / 60);
18
+ --_hw-type-weight: var(--hw-weight-bold);
19
+ --_hw-type-spacing: 1.5rem;
20
+ }
21
+ .hw-type[data-scale='display-lg'] {
22
+ --_hw-type-size: var(--hw-text-5xl);
23
+ --_hw-type-leading: calc(60 / 48);
24
+ --_hw-type-weight: var(--hw-weight-bold);
25
+ --_hw-type-spacing: 0.625rem;
26
+ }
27
+ .hw-type[data-scale='display-md'] {
28
+ --_hw-type-size: var(--hw-text-4xl);
29
+ --_hw-type-leading: calc(44 / 36);
30
+ --_hw-type-weight: var(--hw-weight-semibold);
31
+ --_hw-type-spacing: 0.625rem;
32
+ }
33
+ .hw-type[data-scale='display-sm'] {
34
+ --_hw-type-size: var(--hw-text-3xl);
35
+ --_hw-type-leading: calc(38 / 30);
36
+ --_hw-type-weight: var(--hw-weight-bold);
37
+ --_hw-type-spacing: 0.625rem;
38
+ }
39
+ .hw-type[data-scale='display-xs'] {
40
+ --_hw-type-size: var(--hw-text-2xl);
41
+ --_hw-type-leading: calc(32 / 24);
42
+ --_hw-type-weight: var(--hw-weight-bold);
43
+ --_hw-type-spacing: 0.625rem;
44
+ }
45
+ .hw-type[data-scale='heading-lg'] {
46
+ --_hw-type-size: var(--hw-text-xl);
47
+ --_hw-type-leading: calc(30 / 20);
48
+ --_hw-type-weight: var(--hw-weight-semibold);
49
+ --_hw-type-spacing: 0.625rem;
50
+ }
51
+ .hw-type[data-scale='heading-md'] {
52
+ --_hw-type-size: var(--hw-text-lg);
53
+ --_hw-type-leading: calc(28 / 18);
54
+ --_hw-type-weight: var(--hw-weight-semibold);
55
+ --_hw-type-spacing: 0.625rem;
56
+ }
57
+ .hw-type[data-scale='heading-sm'] {
58
+ --_hw-type-size: var(--hw-text-md);
59
+ --_hw-type-leading: calc(24 / 16);
60
+ --_hw-type-weight: var(--hw-weight-semibold);
61
+ --_hw-type-spacing: 0.625rem;
62
+ }
63
+ .hw-type[data-scale='body-xl'] {
64
+ --_hw-type-size: var(--hw-text-xl);
65
+ --_hw-type-leading: calc(30 / 20);
66
+ --_hw-type-weight: var(--hw-weight-regular);
67
+ --_hw-type-spacing: 0rem;
68
+ }
69
+ .hw-type[data-scale='body-lg'] {
70
+ --_hw-type-size: var(--hw-text-lg);
71
+ --_hw-type-leading: calc(28 / 18);
72
+ --_hw-type-weight: var(--hw-weight-regular);
73
+ --_hw-type-spacing: 0rem;
74
+ }
75
+ .hw-type[data-scale='body-md'] {
76
+ --_hw-type-size: var(--hw-text-md);
77
+ --_hw-type-leading: calc(24 / 16);
78
+ --_hw-type-weight: var(--hw-weight-regular);
79
+ --_hw-type-spacing: 0rem;
80
+ }
81
+ .hw-type[data-scale='body-sm'] {
82
+ --_hw-type-size: var(--hw-text-sm);
83
+ --_hw-type-leading: calc(20 / 14);
84
+ --_hw-type-weight: var(--hw-weight-regular);
85
+ --_hw-type-spacing: 0rem;
86
+ }
87
+ .hw-type[data-scale='body-xs'] {
88
+ --_hw-type-size: var(--hw-text-xs);
89
+ --_hw-type-leading: calc(14 / 12);
90
+ --_hw-type-weight: var(--hw-weight-regular);
91
+ --_hw-type-spacing: 0rem;
92
+ }
93
+
94
+ .hw-line-clamp {
95
+ display: -webkit-box;
96
+ -webkit-box-orient: vertical;
97
+ -webkit-line-clamp: var(--hw-clamp-lines, 1);
98
+ overflow: hidden;
99
+ overflow-wrap: anywhere;
100
+ }
101
+ .hw-line-clamp[data-lines='2'] { --hw-clamp-lines: 2; }
102
+ .hw-line-clamp[data-lines='3'] { --hw-clamp-lines: 3; }
103
+ .hw-line-clamp[data-lines='4'] { --hw-clamp-lines: 4; }
104
+ .hw-line-clamp[data-lines='10'] { --hw-clamp-lines: 10; }
105
+
106
+ .hw-divider[data-tone='primary'] { --_hw-divider-color: var(--hw-color-primary); }
107
+ .hw-divider[data-tone='gold'] { --_hw-divider-color: var(--hw-color-divider-gold); }
108
+ .hw-divider[data-tone='tertiary'] { --_hw-divider-color: var(--hw-color-divider-tertiary); }
109
+ .hw-divider[data-tone] { border-color: var(--_hw-divider-color, var(--hw-color-border)); }
110
+ @media (forced-colors: active) {
111
+ .hw-divider[data-tone] { border-color: CanvasText; }
112
+ }
113
+
114
+ /* The semantic hr itself participates in a flex or grid row in Angular. */
115
+ hw-divider:has(> .hw-divider[aria-orientation='vertical']) { display: contents; }
@@ -0,0 +1,72 @@
1
+ /* NIC global.css 1388–1531; source sizes and adaptations: docs/nic-icons.md. */
2
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
3
+ --hw-profile-icon-glyph: 1.25rem;
4
+ --hw-profile-icon-glyph-sm: 1rem;
5
+ }
6
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
7
+ --hw-profile-icon-glyph: initial;
8
+ --hw-profile-icon-glyph-sm: initial;
9
+ }
10
+ .hw-button:is(.hw-icon-button, [data-icon-only]) {
11
+ --hw-icon-context-size: var(--hw-profile-icon-glyph, 1.5rem);
12
+ inline-size: var(--hw-button-control-height); min-inline-size: var(--hw-button-control-height);
13
+ block-size: var(--hw-button-control-height); min-block-size: var(--hw-button-control-height);
14
+ flex: none; padding: 0; gap: 0;
15
+ }
16
+ .hw-button:is(.hw-icon-button, [data-icon-only])[data-size='sm'] { --hw-icon-context-size: var(--hw-profile-icon-glyph-sm, min(1.5rem, calc(var(--hw-button-control-height) - 2px))); }
17
+ .hw-button:is(.hw-icon-button, [data-icon-only])[data-shape='circle'] { border-radius: var(--hw-radius-full); }
18
+ .hw-button:is(.hw-icon-button, [data-icon-only]) > span { display:inline-flex; align-items:center; justify-content:center; line-height:1; }
19
+ /* Size both direct artwork and framework-projected artwork. Explicit CSS and
20
+ the existing --hw-icon-size override remain available. No SVG paths change. */
21
+ .hw-button:is(.hw-icon-button, [data-icon-only]) > :is(svg,img),
22
+ .hw-button:is(.hw-icon-button, [data-icon-only]) > span > :is(svg,img) {
23
+ inline-size:var(--hw-icon-size,var(--hw-icon-context-size));
24
+ block-size:var(--hw-icon-size,var(--hw-icon-context-size)); flex:none; object-fit:contain;
25
+ }
26
+ .hw-button:is(.hw-icon-button,[data-icon-only])[aria-pressed='true']:not(:disabled,[aria-disabled='true']) {
27
+ background:var(--hw-color-primary-subtle); color:var(--hw-color-primary-text);
28
+ }
29
+ .hw-button:is(.hw-icon-button, [data-icon-only]):is(:disabled,[aria-disabled='true']) {
30
+ color:var(--hw-color-on-disabled); box-shadow:none;
31
+ }
32
+ /* Background icons are decorative compositions, not extra interactive targets. */
33
+ .hw-icon-background {
34
+ box-sizing:border-box; display:inline-flex; flex:none; align-items:center; justify-content:center;
35
+ inline-size:3rem; min-inline-size:3rem; block-size:3rem; padding:0;
36
+ border-radius:var(--hw-radius-full); background:var(--hw-color-success-subtle); color:var(--hw-color-success);
37
+ --hw-icon-context-size:1.5rem;
38
+ }
39
+ .hw-icon-background[data-size='xs'] { inline-size:1.875rem; min-inline-size:1.875rem; block-size:1.875rem; --hw-icon-context-size:0.875rem; }
40
+ /* Source md and xl backgrounds are both 48px; size the artwork separately. */
41
+ .hw-icon-background[data-size='xl'] { inline-size:3rem; min-inline-size:3rem; block-size:3rem; }
42
+ /* Featured icon is the Figma composition; NIC icon-bg sizing above remains available. */
43
+ .hw-icon-background[data-variant='featured'] {
44
+ --hw-featured-size: 2.5rem; --hw-icon-context-size: 1.25rem;
45
+ --hw-featured-radius: .25rem; --hw-featured-outline-radius: .5rem;
46
+ --hw-featured-color: var(--hw-color-primary-text);
47
+ --hw-featured-background: var(--hw-color-primary-subtle);
48
+ inline-size: var(--hw-featured-size); min-inline-size: var(--hw-featured-size); block-size: var(--hw-featured-size);
49
+ color: var(--hw-featured-color); background: var(--hw-featured-background);
50
+ }
51
+ .hw-icon-background[data-variant='featured'][data-size='sm'] { --hw-featured-size:2rem; --hw-icon-context-size:1rem; --hw-featured-outline-radius:.375rem; }
52
+ .hw-icon-background[data-variant='featured'][data-size='lg'] { --hw-featured-size:3rem; --hw-icon-context-size:1.5rem; --hw-featured-radius:.5rem; --hw-featured-outline-radius:.625rem; }
53
+ .hw-icon-background[data-variant='featured'][data-size='xl'] { --hw-featured-size:3.5rem; --hw-icon-context-size:1.75rem; --hw-featured-radius:.5rem; --hw-featured-outline-radius:.75rem; }
54
+ .hw-icon-background[data-variant='featured'][data-shape='square'] { border-radius:var(--hw-featured-radius); }
55
+ .hw-icon-background[data-variant='featured'][data-tone='neutral'] { --hw-featured-color:var(--hw-color-text-muted); --hw-featured-background:var(--hw-color-surface-muted); }
56
+ .hw-icon-background[data-variant='featured'][data-tone='success'] { --hw-featured-color:var(--hw-color-success); --hw-featured-background:var(--hw-color-success-subtle); }
57
+ .hw-icon-background[data-variant='featured'][data-tone='error'] { --hw-featured-color:var(--hw-color-danger); --hw-featured-background:var(--hw-color-danger-subtle); }
58
+ .hw-icon-background[data-variant='featured'][data-tone='warning'] { --hw-featured-color:var(--hw-color-warning); --hw-featured-background:var(--hw-color-warning-subtle); }
59
+ .hw-icon-background[data-variant='featured'][data-tone='info'] { --hw-featured-color:var(--hw-color-info); --hw-featured-background:var(--hw-color-info-subtle); }
60
+ .hw-icon-background[data-variant='featured'][data-style='outline'] { background:transparent; border:1px solid var(--hw-featured-color); }
61
+ .hw-icon-background[data-variant='featured'][data-style='outline'][data-shape='square'] { border-radius:var(--hw-featured-outline-radius); }
62
+ .hw-icon-background[data-variant='featured'][data-style='dark'] { background:var(--hw-featured-color); color:var(--hw-color-surface); }
63
+ .hw-featured-symbol { display:inline-flex; align-items:center; justify-content:center; inline-size:var(--hw-icon-context-size); block-size:var(--hw-icon-context-size); font-size:var(--hw-icon-context-size); font-weight:600; line-height:1; }
64
+ .hw-icon[data-size='sm'] { --hw-icon-context-size:0.875rem; }
65
+ .hw-icon[data-size='md'] { --hw-icon-context-size:1.25rem; }
66
+ .hw-icon[data-size='lg'] { --hw-icon-context-size:1.5rem; }
67
+ .hw-icon[data-size='xl'] { --hw-icon-context-size:1.875rem; }
68
+ .hw-icon[data-size='2xl'] { --hw-icon-context-size:3rem; }
69
+ @media (forced-colors:active) {
70
+ .hw-button:is(.hw-icon-button,[data-icon-only]):is(:disabled,[aria-disabled='true']) { color:GrayText; }
71
+ .hw-icon-background, .hw-icon-background[data-variant='featured'], .hw-icon-background[data-variant='featured'][data-style] { background:Canvas; color:CanvasText; border-color:CanvasText; outline:1px solid CanvasText; }
72
+ }
@@ -0,0 +1,35 @@
1
+ /* NIC global.css 2554–2581: one animated line spans input + addons.
2
+ Only an editable focused control activates it, not a sibling addon button. */
3
+ .hw-input-group:has(> .hw-input-addon) { position: relative; --hw-group-line-color: var(--hw-color-field-active); }
4
+ .hw-input-addon:empty { display: none; }
5
+ .hw-input-group > .hw-input-addon:empty:first-child + :is(.hw-input, .hw-select) { border-start-start-radius: var(--hw-profile-control-radius, var(--hw-radius-md)); border-end-start-radius: var(--hw-profile-control-radius, var(--hw-radius-md)); }
6
+ .hw-input-group > :is(.hw-input, .hw-select):has(+ .hw-input-addon:empty:last-child) { border-start-end-radius: var(--hw-profile-control-radius, var(--hw-radius-md)); border-end-end-radius: var(--hw-profile-control-radius, var(--hw-radius-md)); }
7
+ .hw-input-group:has(> .hw-input-addon)::after {
8
+ content: '';
9
+ display: var(--hw-dga-on, none) var(--hw-dga-off, block);
10
+ position: absolute;
11
+ z-index: 2;
12
+ pointer-events: none;
13
+ inset-inline: 0;
14
+ inset-block-end: 0;
15
+ block-size: 2px;
16
+ background: linear-gradient(var(--hw-group-line-color), var(--hw-group-line-color)) center bottom / 0% 2px no-repeat;
17
+ transition: background-size var(--hw-duration-input) var(--hw-ease-input);
18
+ }
19
+ .hw-input-group:has(> .hw-input-addon) > :is(.hw-input, .hw-select) {
20
+ --hw-profile-field-focus-line: 0% 2px;
21
+ --hw-profile-field-pressed-line: 0% 2px;
22
+ }
23
+ .hw-input-group:has(> :is(.hw-input, .hw-select):focus:not(:disabled, [readonly]))::after { background-size: 100% 2px; }
24
+ .hw-input-group:has(> :is(.hw-input, .hw-select):active:not(:disabled, [readonly]))::after { background-size: 50% 2px; }
25
+ .hw-input-group:has(> :is(.hw-input, .hw-select):where([data-hw-filled='true']):valid) { --hw-group-line-color: var(--hw-color-primary-text); }
26
+ .hw-input-group:has(> :is(.hw-input, .hw-select)[aria-invalid='true']) { --hw-group-line-color: var(--hw-color-danger); }
27
+ @supports selector(:user-invalid) {
28
+ .hw-input-group:has(> :is(.hw-input, .hw-select):user-invalid) { --hw-group-line-color: var(--hw-color-danger); }
29
+ }
30
+ @media (prefers-reduced-motion: reduce) {
31
+ .hw-input-group:has(> .hw-input-addon)::after { transition: none; }
32
+ }
33
+ @media (forced-colors: active) {
34
+ .hw-input-group:has(> .hw-input-addon)::after { display: none; }
35
+ }
@@ -0,0 +1,61 @@
1
+ /* NIC global.css 853–965 and 2040–2143. Contrast substitutions and browser
2
+ visited-state privacy limits are recorded in docs/nic-links.md. */
3
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
4
+ --hw-profile-link-hover-thickness: 1px;
5
+ --hw-profile-breadcrumb-gap: 0.25rem;
6
+ --hw-profile-breadcrumb-duration: 200ms;
7
+ --hw-profile-breadcrumb-weight: 400;
8
+ --hw-profile-breadcrumb-separator: '';
9
+ --hw-profile-breadcrumb-size: 0.375rem;
10
+ --hw-profile-breadcrumb-border: 1.5px;
11
+ --hw-profile-breadcrumb-angle: 45deg;
12
+ --hw-profile-breadcrumb-margin: 0.25rem;
13
+ }
14
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
15
+ --hw-profile-link-hover-thickness: initial;
16
+ --hw-profile-breadcrumb-gap: initial;
17
+ --hw-profile-breadcrumb-duration: initial;
18
+ --hw-profile-breadcrumb-weight: initial;
19
+ --hw-profile-breadcrumb-separator: initial;
20
+ --hw-profile-breadcrumb-size: initial;
21
+ --hw-profile-breadcrumb-border: initial;
22
+ --hw-profile-breadcrumb-angle: initial;
23
+ --hw-profile-breadcrumb-margin: initial;
24
+ }
25
+ .hw-link { --hw-link-rest: var(--hw-color-link); --hw-link-hover: var(--hw-color-link-hover); --hw-link-active: var(--hw-color-link-active); --hw-link-visited: var(--hw-color-link-visited); color: var(--hw-link-rest); }
26
+ /* Hosts may supply their own decorative indicator using data-hw-external-icon. */
27
+ :is(.hw-link, .hw-portal-header a)[target='_blank']:not([data-hw-external-icon='none']):not(:has([data-hw-external-icon], .hw-portal-footer-external))::after {
28
+ content: ''; display: inline-block; flex: none; inline-size: 1em; block-size: 1em;
29
+ margin-inline-start: .25em; vertical-align: -.125em;
30
+ background: currentColor; mask: url('./assets/icons/link-square-02.svg') center / contain no-repeat;
31
+ }
32
+ .hw-link:is([data-variant='subtle'], [data-variant='neutral']) { --hw-link-rest: var(--hw-color-link-neutral); --hw-link-hover: var(--hw-color-link-neutral-hover); --hw-link-active: var(--hw-color-link-neutral-active); --hw-link-visited: var(--hw-color-link-neutral); color: var(--hw-link-rest); text-decoration: none; }
33
+ .hw-link:visited { color: var(--hw-link-visited); }
34
+ .hw-link:hover { color: var(--hw-link-hover); text-decoration: underline; text-decoration-thickness: var(--hw-profile-link-hover-thickness, 2px); }
35
+ .hw-link:focus-visible { color: var(--hw-link-rest); outline: 2px solid var(--hw-color-focus-contrast); outline-offset: 2px; }
36
+ .hw-link:active { color: var(--hw-link-active); }
37
+ .hw-link:is(.hw-link-icon, [data-variant='standalone']):is(:hover, :active) { text-decoration: none; }
38
+ .hw-link[aria-disabled='true'], .hw-link[aria-disabled='true']:is(:hover, :active, :visited) { color: var(--hw-color-on-disabled); text-decoration: underline; cursor: not-allowed; }
39
+ .hw-breadcrumb { line-height: 1.5rem; }
40
+ .hw-breadcrumb :is(ol, ul), .hw-breadcrumb li { gap: var(--hw-profile-breadcrumb-gap, var(--hw-space-2)); }
41
+ .hw-breadcrumb a { color: var(--hw-color-link-neutral); transition: color var(--hw-profile-breadcrumb-duration, 0ms) ease; }
42
+ .hw-breadcrumb a:visited { color: var(--hw-color-link-neutral); }
43
+ .hw-breadcrumb a:hover { color: var(--hw-color-link-neutral-hover); }
44
+ .hw-breadcrumb a:focus-visible { color: var(--hw-color-link-neutral); text-decoration: none; outline: 2px solid var(--hw-color-focus-contrast); outline-offset: 2px; }
45
+ .hw-breadcrumb a:active { color: var(--hw-color-link-neutral-active); }
46
+ .hw-breadcrumb [aria-current='page'] { color: var(--hw-color-breadcrumb-current); font-weight: var(--hw-profile-breadcrumb-weight, var(--hw-weight-medium)); }
47
+ .hw-breadcrumb [aria-disabled='true'] { color: var(--hw-color-on-disabled); cursor: not-allowed; }
48
+ /* Empty generated geometry is decorative; no private icon-font glyph is read
49
+ as content. A logical chevron follows direction independently of language. */
50
+ .hw-breadcrumb li + li::before { content: var(--hw-profile-breadcrumb-separator, '/'); flex: none; inline-size: var(--hw-profile-breadcrumb-size, auto); block-size: var(--hw-profile-breadcrumb-size, auto); margin-inline: var(--hw-profile-breadcrumb-margin, 0px); border-block-start: var(--hw-profile-breadcrumb-border, 0px) solid currentColor; border-inline-end: var(--hw-profile-breadcrumb-border, 0px) solid currentColor; transform: rotate(calc(var(--_hw-inline-sign, 1) * var(--hw-profile-breadcrumb-angle, 0deg))); color: var(--hw-color-text-subtle); }
51
+ @media (prefers-reduced-motion: reduce) { .hw-breadcrumb a { transition: none; } }
52
+ @media (forced-colors: active) {
53
+ :is(.hw-link, .hw-portal-header a)[target='_blank']::after { background: LinkText; forced-color-adjust: none; }
54
+ .hw-link, .hw-link[data-variant] { --hw-link-rest: LinkText; --hw-link-hover: LinkText; --hw-link-active: LinkText; --hw-link-visited: VisitedText; color: LinkText; }
55
+ .hw-breadcrumb a { color: LinkText; }
56
+ .hw-link:visited { color: VisitedText; }
57
+ .hw-link:is(:hover, :active, :focus-visible), .hw-breadcrumb a:is(:hover, :active, :focus-visible) { color: LinkText; }
58
+ .hw-link:focus-visible, .hw-breadcrumb a:focus-visible { outline-color: Highlight; }
59
+ .hw-link[aria-disabled='true'], .hw-link[aria-disabled='true']:is(:hover, :active, :visited), .hw-breadcrumb [aria-disabled='true'] { color: GrayText; }
60
+ .hw-breadcrumb [aria-current='page'] { color: CanvasText; }
61
+ }
@@ -0,0 +1,68 @@
1
+ /* NIC global.css 1645–1674 and 3183–3211. Styling is opt-in per list. */
2
+ ul.hw-list-icon,
3
+ ol.hw-list-ordered {
4
+ margin-inline: var(--hw-list-start-margin, 5px) 0;
5
+ }
6
+
7
+ ol.hw-list-ordered {
8
+ list-style-type: decimal;
9
+ }
10
+
11
+ ul.hw-list-icon > li,
12
+ ul.hw-list-custom > li {
13
+ list-style-type: none;
14
+ }
15
+
16
+ ul.hw-list-icon > li {
17
+ position: relative;
18
+ padding-inline-start: var(--hw-list-icon-indent, 30px);
19
+ }
20
+
21
+ .hw-list-marker {
22
+ display: inline-grid;
23
+ place-items: center;
24
+ inline-size: var(--hw-list-marker-size, 16px);
25
+ block-size: var(--hw-list-marker-size, 16px);
26
+ color: inherit;
27
+ font-size: var(--hw-list-marker-size, 16px);
28
+ }
29
+
30
+ .hw-list-marker > svg {
31
+ display: block;
32
+ inline-size: 1em;
33
+ block-size: 1em;
34
+ }
35
+
36
+ /* The source uses an external icon font. This local ring is decorative. */
37
+ .hw-list-marker:empty::before {
38
+ content: '';
39
+ box-sizing: border-box;
40
+ inline-size: .45em;
41
+ block-size: .45em;
42
+ border: .1em solid currentColor;
43
+ border-radius: 50%;
44
+ }
45
+
46
+ ul.hw-list-icon > li > .hw-list-marker {
47
+ position: absolute;
48
+ inset-block-start: 0;
49
+ inset-inline-start: 0;
50
+ block-size: var(--hw-list-marker-line, 28px);
51
+ line-height: var(--hw-list-marker-line, 28px);
52
+ }
53
+
54
+ ul.hw-list-custom {
55
+ margin-inline-start: 0;
56
+ padding-inline-start: var(--hw-list-custom-indent, 20px);
57
+ }
58
+
59
+ ul.hw-list-custom > li > .hw-list-marker {
60
+ position: relative;
61
+ inset-block-start: 1px;
62
+ margin-inline-end: .25em;
63
+ vertical-align: text-bottom;
64
+ }
65
+
66
+ @media (forced-colors: active) {
67
+ .hw-list-marker:empty::before { border-color: CanvasText; }
68
+ }