@hawiyah/styles 0.0.0-stage → 0.2.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 (118) 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/arrow-down-01.svg +3 -0
  41. package/dist/assets/icons/arrow-left-01.svg +3 -0
  42. package/dist/assets/icons/arrow-right-01.svg +3 -0
  43. package/dist/assets/icons/calendar-03.svg +6 -0
  44. package/dist/assets/icons/cancel-01.svg +3 -0
  45. package/dist/assets/icons/checkmark-circle-02.svg +4 -0
  46. package/dist/assets/icons/filter-horizontal.svg +8 -0
  47. package/dist/assets/icons/home-01.svg +3 -0
  48. package/dist/assets/icons/link-04.svg +4 -0
  49. package/dist/assets/icons/lock-password.svg +7 -0
  50. package/dist/assets/icons/menu-01.svg +5 -0
  51. package/dist/assets/icons/provenance.json +202 -0
  52. package/dist/assets/icons/search-01.svg +4 -0
  53. package/dist/assets/icons/sorting-05.svg +8 -0
  54. package/dist/assets/icons/thumbs-down.svg +4 -0
  55. package/dist/assets/icons/thumbs-up.svg +4 -0
  56. package/dist/assets/icons/view-off-slash.svg +5 -0
  57. package/dist/assets/icons/view.svg +4 -0
  58. package/dist/assets/notifications/danger-outline.svg +3 -0
  59. package/dist/assets/notifications/danger.svg +4 -0
  60. package/dist/assets/notifications/info-outline.svg +3 -0
  61. package/dist/assets/notifications/info.svg +4 -0
  62. package/dist/assets/notifications/neutral-outline.svg +3 -0
  63. package/dist/assets/notifications/neutral.svg +4 -0
  64. package/dist/assets/notifications/success-outline.svg +3 -0
  65. package/dist/assets/notifications/success.svg +4 -0
  66. package/dist/assets/notifications/warning-outline.svg +3 -0
  67. package/dist/assets/notifications/warning.svg +4 -0
  68. package/dist/assets/pagination-arrow.svg +1 -0
  69. package/dist/assets/select-down.svg +4 -0
  70. package/dist/assets/select-up.svg +4 -0
  71. package/dist/brand-loader.css +12 -0
  72. package/dist/components.css +335 -0
  73. package/dist/content-navigation.css +44 -0
  74. package/dist/date-picker.css +50 -0
  75. package/dist/dga.css +316 -0
  76. package/dist/direction.css +14 -0
  77. package/dist/extended.css +310 -0
  78. package/dist/feedback.css +48 -0
  79. package/dist/file-upload-list.css +64 -0
  80. package/dist/icons.css +42 -0
  81. package/dist/layout.css +129 -0
  82. package/dist/link-composition.css +10 -0
  83. package/dist/mobile-navigation.css +43 -0
  84. package/dist/mobile-top-bar.css +15 -0
  85. package/dist/navigation-drawer.css +103 -0
  86. package/dist/nic-accordion.css +96 -0
  87. package/dist/nic-avatars.css +33 -0
  88. package/dist/nic-badges.css +56 -0
  89. package/dist/nic-buttons.css +80 -0
  90. package/dist/nic-cards.css +77 -0
  91. package/dist/nic-carousel.css +77 -0
  92. package/dist/nic-choices.css +64 -0
  93. package/dist/nic-footer.css +73 -0
  94. package/dist/nic-foundations.css +115 -0
  95. package/dist/nic-icons.css +72 -0
  96. package/dist/nic-input-groups.css +35 -0
  97. package/dist/nic-links.css +61 -0
  98. package/dist/nic-lists.css +68 -0
  99. package/dist/nic-notification-dialog.css +114 -0
  100. package/dist/nic-notifications.css +124 -0
  101. package/dist/nic-pagination.css +73 -0
  102. package/dist/nic-rating.css +53 -0
  103. package/dist/nic-search.css +70 -0
  104. package/dist/nic-segmented.css +117 -0
  105. package/dist/nic-select.css +51 -0
  106. package/dist/nic-tables.css +68 -0
  107. package/dist/nic-tabs.css +86 -0
  108. package/dist/password-field.css +16 -0
  109. package/dist/portal-branches.css +52 -0
  110. package/dist/portal.css +24 -0
  111. package/dist/reset.css +12 -0
  112. package/dist/riyal.css +32 -0
  113. package/dist/search-field.css +11 -0
  114. package/dist/site-verification.css +36 -0
  115. package/dist/stepper.css +46 -0
  116. package/dist/styles.css +49 -0
  117. package/dist/tooltip-placement.css +65 -0
  118. package/package.json +51 -3
@@ -0,0 +1,114 @@
1
+ /* NIC global.css 3883–3957 and master.js 441–520. The Angular host carries the variant. */
2
+ :where(dialog, hw-dialog)[data-variant='notification'] {
3
+ --_nq-notice-ink: var(--hw-color-info);
4
+ --_nq-notice-surface: var(--hw-color-info-subtle);
5
+ --_nq-notice-border: var(--hw-color-notice-info-border);
6
+ --_nq-notice-symbol: url('./assets/notifications/info-outline.svg');
7
+ }
8
+ :where(dialog, hw-dialog)[data-variant='notification'][data-tone='success'] {
9
+ --_nq-notice-ink: var(--hw-color-success);
10
+ --_nq-notice-surface: var(--hw-color-success-subtle);
11
+ --_nq-notice-border: var(--hw-color-notice-success-border);
12
+ --_nq-notice-symbol: url('./assets/notifications/success-outline.svg');
13
+ }
14
+ :where(dialog, hw-dialog)[data-variant='notification'][data-tone='warning'] {
15
+ --_nq-notice-ink: var(--hw-color-notice-warning-text);
16
+ --_nq-notice-surface: var(--hw-color-warning-subtle);
17
+ --_nq-notice-border: var(--hw-color-notice-warning-border);
18
+ --_nq-notice-symbol: url('./assets/notifications/warning-outline.svg');
19
+ }
20
+ :where(dialog, hw-dialog)[data-variant='notification'][data-tone='danger'] {
21
+ --_nq-notice-ink: var(--hw-color-danger);
22
+ --_nq-notice-surface: var(--hw-color-danger-subtle);
23
+ --_nq-notice-border: var(--hw-color-notice-danger-border);
24
+ --_nq-notice-symbol: url('./assets/notifications/danger-outline.svg');
25
+ }
26
+ :where(dialog, hw-dialog)[data-variant='notification'][data-tone='neutral'] {
27
+ --_nq-notice-ink: var(--hw-color-notice-neutral-text);
28
+ --_nq-notice-surface: var(--hw-color-badge-neutral-background);
29
+ --_nq-notice-border: var(--hw-color-notice-neutral-text);
30
+ --_nq-notice-symbol: url('./assets/notifications/neutral-outline.svg');
31
+ }
32
+
33
+ :is(dialog.hw-dialog[data-variant='notification'], hw-dialog[data-variant='notification'] > dialog.hw-dialog) {
34
+ box-sizing: border-box;
35
+ inline-size: min(500px, calc(100% - 40px));
36
+ max-inline-size: none;
37
+ max-block-size: calc(100dvh - 40px);
38
+ padding: 24px;
39
+ overflow: auto;
40
+ border: 0;
41
+ border-inline-start: 4px solid var(--_nq-notice-border);
42
+ border-radius: 12px;
43
+ background: var(--hw-color-surface);
44
+ color: var(--hw-color-text);
45
+ box-shadow: var(--hw-notification-dialog-shadow, 0 20px 25px -5px rgb(0 0 0 / .1), 0 10px 10px -5px rgb(0 0 0 / .04));
46
+
47
+ &[open] {
48
+ display: grid;
49
+ grid-template-columns: 48px minmax(0, 1fr) auto;
50
+ column-gap: 16px;
51
+ row-gap: 8px;
52
+ animation: hw-notice-dialog-in 300ms ease-out;
53
+ }
54
+ &::backdrop { background: rgb(0 0 0 / .5); backdrop-filter: none; animation: hw-notice-backdrop-in 200ms ease-out; }
55
+ & > .hw-dialog-header { display: contents; }
56
+ & > .hw-dialog-header::before, & > .hw-dialog-header::after {
57
+ content: '';
58
+ grid-column: 1;
59
+ grid-row: 1 / span 2;
60
+ align-self: start;
61
+ justify-self: center;
62
+ pointer-events: none;
63
+ }
64
+ & > .hw-dialog-header::before { inline-size: 48px; block-size: 48px; border-radius: 50%; background: var(--_nq-notice-surface); }
65
+ & > .hw-dialog-header::after {
66
+ margin-block-start: 12px;
67
+ inline-size: 24px; block-size: 24px;
68
+ background-color: var(--_nq-notice-ink);
69
+ mask: var(--_nq-notice-symbol) center / contain no-repeat;
70
+ }
71
+ & > .hw-dialog-header > :is(h1, h2, h3) { grid-column: 2; grid-row: 1; align-self: start; margin: 0; font-size: 1.125rem; font-weight: 600; overflow-wrap: anywhere; }
72
+ & > .hw-dialog-header > button {
73
+ grid-column: 3; grid-row: 1 / span 2; align-self: start; justify-self: end;
74
+ display: grid; place-items: center; gap: 0; inline-size: 40px; min-inline-size: 40px;
75
+ padding: 0; font-size: 0; color: var(--hw-color-text-muted);
76
+ }
77
+ & > .hw-dialog-header > button::before {
78
+ content: ''; inline-size: 24px; block-size: 24px; background-color: currentColor;
79
+ mask: url('./assets/icons/cancel-01.svg') center / contain no-repeat;
80
+ }
81
+ & > .hw-dialog-header > button:hover { color: var(--hw-color-text); }
82
+ & > .hw-dialog-body {
83
+ grid-column: 2; grid-row: 2; min-inline-size: 0; padding: 0;
84
+ font-size: .875rem; line-height: 1.6; color: var(--hw-color-text-muted); overflow-wrap: anywhere;
85
+ }
86
+ & > .hw-dialog-body > :first-child { margin-block-start: 0; }
87
+ & > .hw-dialog-body > :last-child { margin-block-end: 0; }
88
+ & > .hw-dialog-footer {
89
+ grid-column: 1 / -1; display: flex; flex-wrap: wrap; justify-content: flex-end;
90
+ gap: 12px; margin-block-start: 12px; padding: 0; background: transparent; border: 0;
91
+ }
92
+ & > .hw-dialog-footer:empty { display: none; }
93
+ }
94
+ @keyframes hw-notice-dialog-in { from { transform: translateY(-20px); opacity: 0; } }
95
+ @keyframes hw-notice-backdrop-in { from { opacity: 0; } }
96
+ @media (max-width: 576px) {
97
+ :is(dialog.hw-dialog[data-variant='notification'], hw-dialog[data-variant='notification'] > dialog.hw-dialog) {
98
+ inline-size: calc(100% - 60px);
99
+ & > .hw-dialog-header::before, & > .hw-dialog-header::after, & > .hw-dialog-header > button { grid-row: 1; }
100
+ & > .hw-dialog-body { grid-column: 1 / -1; }
101
+ & > .hw-dialog-footer { flex-direction: column; align-items: stretch; }
102
+ }
103
+ }
104
+ @media (prefers-reduced-motion: reduce) {
105
+ :is(dialog.hw-dialog[data-variant='notification'], hw-dialog[data-variant='notification'] > dialog.hw-dialog) {
106
+ &[open], &::backdrop { animation: none; }
107
+ }
108
+ }
109
+ @media (forced-colors: active) {
110
+ :is(dialog.hw-dialog[data-variant='notification'], hw-dialog[data-variant='notification'] > dialog.hw-dialog) {
111
+ border: 1px solid CanvasText; border-inline-start-width: 4px;
112
+ & > .hw-dialog-header::after, & > .hw-dialog-header > button::before { forced-color-adjust: none; background-color: CanvasText; }
113
+ }
114
+ }
@@ -0,0 +1,124 @@
1
+ /* NIC global.css 3797–3876 and master.js 318–412. */
2
+ .hw-toast-region[data-variant='banner'] {
3
+ --_nq-toast-gutter: 20px;
4
+ --_nq-toast-top: var(--hw-toast-header-offset, 80px);
5
+ box-sizing: border-box;
6
+ inset-block: var(--_nq-toast-top) auto;
7
+ inset-inline: auto var(--_nq-toast-gutter);
8
+ inline-size: min(450px, calc(100% - 2 * var(--_nq-toast-gutter)));
9
+ max-block-size: calc(100dvh - var(--_nq-toast-top) - var(--_nq-toast-gutter));
10
+ padding: 0;
11
+ overscroll-behavior: contain;
12
+ /* The viewport edge bounds a fixed stack; notices may be taller when text wraps. */
13
+ }
14
+ .hw-toast-region[data-variant='banner']:is([data-position='top-start'], [data-position='bottom-start']) {
15
+ inset-inline: var(--_nq-toast-gutter) auto;
16
+ }
17
+ .hw-toast-region[data-variant='banner']:is([data-position='bottom-start'], [data-position='bottom-end']) {
18
+ inset-block: auto var(--_nq-toast-gutter);
19
+ max-block-size: calc(100dvh - 2 * var(--_nq-toast-gutter));
20
+ }
21
+ .hw-toast-region[data-position='inline'] {
22
+ position: static;
23
+ inline-size: 100%;
24
+ max-block-size: none;
25
+ overflow: visible;
26
+ }
27
+ .hw-toast-region[data-variant='banner'] .hw-toast {
28
+ --_nq-toast-accent: var(--hw-color-notice-info-border);
29
+ --_nq-toast-icon: url('./assets/notifications/info.svg');
30
+ --_nq-toast-text: var(--hw-color-info);
31
+ --_nq-toast-bg: var(--hw-color-info-subtle);
32
+ display: grid;
33
+ grid-template-columns: auto minmax(0, 1fr) auto;
34
+ gap: 12px;
35
+ align-items: center;
36
+ box-sizing: border-box;
37
+ padding: 16px 24px;
38
+ border: 0;
39
+ border-block-end: 2px solid var(--_nq-toast-accent);
40
+ border-radius: 0;
41
+ color: var(--_nq-toast-text);
42
+ background-color: var(--_nq-toast-bg);
43
+ box-shadow: var(--hw-toast-banner-shadow, 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -1px rgb(0 0 0 / .06));
44
+ font-size: .875rem;
45
+ line-height: 1.5;
46
+ overflow-wrap: anywhere;
47
+ animation: hw-toast-banner-in 300ms ease-out;
48
+ }
49
+ .hw-toast-region[data-variant='banner'] .hw-toast[data-tone='neutral'] {
50
+ --_nq-toast-icon: url('./assets/notifications/neutral.svg');
51
+ --_nq-toast-text: var(--hw-color-notice-neutral-text);
52
+ --_nq-toast-accent: var(--_nq-toast-text);
53
+ --_nq-toast-bg: var(--hw-color-badge-neutral-background);
54
+ }
55
+ .hw-toast-region[data-variant='banner'] .hw-toast[data-tone='success'] {
56
+ --_nq-toast-icon: url('./assets/notifications/success.svg');
57
+ --_nq-toast-text: var(--hw-color-success);
58
+ --_nq-toast-accent: var(--hw-color-notice-success-border);
59
+ --_nq-toast-bg: var(--hw-color-success-subtle);
60
+ }
61
+ .hw-toast-region[data-variant='banner'] .hw-toast[data-tone='warning'] {
62
+ --_nq-toast-icon: url('./assets/notifications/warning.svg');
63
+ --_nq-toast-text: var(--hw-color-notice-warning-text);
64
+ --_nq-toast-accent: var(--hw-color-notice-warning-border);
65
+ --_nq-toast-bg: var(--hw-color-warning-subtle);
66
+ }
67
+ .hw-toast-region[data-variant='banner'] .hw-toast[data-tone='danger'] {
68
+ --_nq-toast-icon: url('./assets/notifications/danger.svg');
69
+ --_nq-toast-text: var(--hw-color-danger);
70
+ --_nq-toast-accent: var(--hw-color-notice-danger-border);
71
+ --_nq-toast-bg: var(--hw-color-danger-subtle);
72
+ }
73
+ .hw-toast-region[data-variant='banner'] .hw-toast-icon {
74
+ grid-column: 1; inline-size: 20px; block-size: 20px;
75
+ background-color: currentColor;
76
+ mask: var(--_nq-toast-icon) center / contain no-repeat;
77
+ }
78
+ .hw-toast-region[data-variant='banner'] .hw-toast-content { grid-column: 2; min-inline-size: 0; }
79
+ .hw-toast-region[data-variant='banner'] .hw-toast-content p { color: inherit; }
80
+ .hw-toast-region[data-variant='banner'] .hw-toast-dismiss { grid-column: 3; grid-row: 1; align-self: center; color: inherit; }
81
+ @keyframes hw-toast-banner-in { from { opacity: 0; transform: translateX(calc(100% * var(--_nq-inline-sign, 1))); } }
82
+ @media (max-width: 576px) {
83
+ .hw-toast-region[data-variant='banner'] { --_nq-toast-gutter: 10px; --_nq-toast-top: var(--hw-toast-header-offset, 70px); }
84
+ }
85
+ @media (prefers-reduced-motion: reduce) {
86
+ .hw-toast-region[data-variant='banner'] .hw-toast { animation: none; }
87
+ }
88
+ @media (forced-colors: active) {
89
+ .hw-toast-region[data-variant='banner'] .hw-toast { border: 1px solid CanvasText; border-block-end-width: 2px; }
90
+ .hw-toast-region[data-variant='banner'] .hw-toast-icon { forced-color-adjust: none; background-color: CanvasText; }
91
+ }
92
+
93
+
94
+ /* Empty live regions stay mounted for announcements without occupying a gap. */
95
+ .hw-toast-region[data-variant='banner'] { row-gap: 0; }
96
+ .hw-toast-region[data-variant='banner'] > [data-hw-live]:has(.hw-toast) + [data-hw-live]:has(.hw-toast) {
97
+ margin-block-start: var(--hw-space-3);
98
+ }
99
+ @media (prefers-reduced-motion: no-preference) {
100
+ .hw-toast-region[data-variant='banner'] .hw-toast-dismiss { transition: color 200ms ease, background-color 200ms ease; }
101
+ }
102
+
103
+ .hw-toast-region[data-variant='banner'] .hw-toast-dismiss {
104
+ color: var(--hw-color-text);
105
+ font-size: 0;
106
+ gap: 0;
107
+ inline-size: 40px;
108
+ min-inline-size: 40px;
109
+ padding-inline: 0;
110
+ }
111
+ .hw-toast-region[data-variant='banner'] .hw-toast-dismiss::before {
112
+ content: '';
113
+ display: block;
114
+ inline-size: 20px;
115
+ block-size: 20px;
116
+ background-color: currentColor;
117
+ mask: url('./assets/icons/cancel-01.svg') center / contain no-repeat;
118
+ }
119
+ @media (forced-colors: active) {
120
+ .hw-toast-region[data-variant='banner'] .hw-toast-dismiss::before {
121
+ forced-color-adjust: none;
122
+ background-color: ButtonText;
123
+ }
124
+ }
@@ -0,0 +1,73 @@
1
+ /* NIC CSS 3505–3666 / 4005–4139. See docs/nic-pagination.md. */
2
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
3
+ --hw-profile-page-size: 40px; --hw-profile-page-radius: 0px;
4
+ --hw-profile-page-margin: 40px; --hw-profile-page-current-bg: transparent;
5
+ --hw-profile-page-current-border: transparent; --hw-profile-page-underline: 3px;
6
+ --hw-profile-page-weight: 400; --hw-profile-page-align: center;
7
+ }
8
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
9
+ --hw-profile-page-size: initial; --hw-profile-page-radius: initial;
10
+ --hw-profile-page-margin: initial; --hw-profile-page-current-bg: initial;
11
+ --hw-profile-page-current-border: initial; --hw-profile-page-underline: initial;
12
+ --hw-profile-page-weight: initial; --hw-profile-page-align: initial;
13
+ }
14
+ .hw-pagination { position: relative; justify-content: var(--hw-profile-page-align, start); margin-block: var(--hw-profile-page-margin, 0px); gap: 8px; max-inline-size: 100%; }
15
+ .hw-pagination[hidden] { display: none; }
16
+ .hw-pagination-items { display: contents; }
17
+ .hw-pagination :is(.hw-pagination-item, .hw-pagination-arrow, .hw-pagination-gap-trigger, [data-hw-page], .hw-pagination-ellipsis) {
18
+ position: relative; box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center;
19
+ min-inline-size: var(--hw-profile-page-size, var(--hw-control-height-sm));
20
+ block-size: var(--hw-profile-page-size, var(--hw-control-height-sm)); min-block-size: var(--hw-profile-page-size, var(--hw-control-height-sm));
21
+ padding: 0 .25rem; border: 1px solid transparent; border-radius: var(--hw-profile-page-radius, var(--hw-radius-md));
22
+ background: transparent; color: var(--hw-color-text); font-family: inherit; font-size: 14px;
23
+ font-weight: 400; line-height: 1; text-decoration: none; cursor: pointer;
24
+ transition: background-color var(--hw-duration-pagination) ease, color var(--hw-duration-pagination) ease;
25
+ }
26
+ .hw-pagination :is(.hw-pagination-item, .hw-pagination-arrow, [data-hw-page]):is(:hover, :active):not(:disabled, [aria-disabled='true']) { background: var(--hw-color-surface-muted); color: var(--hw-color-text); box-shadow: none; }
27
+ .hw-pagination :is(.hw-pagination-item, [data-hw-page])[aria-current='page'] { color: var(--hw-color-text); font-weight: var(--hw-profile-page-weight, var(--hw-weight-semibold)); background: var(--hw-profile-page-current-bg, var(--hw-color-primary-subtle)); border-color: var(--hw-profile-page-current-border, var(--hw-color-primary)); }
28
+ .hw-pagination :is(.hw-pagination-item, [data-hw-page])[aria-current='page']::after {
29
+ content: ''; position: absolute; inset-inline: 4px; inset-block-end: -1px;
30
+ block-size: var(--hw-profile-page-underline, 0px); border-radius: 9999px; background: var(--hw-color-primary);
31
+ }
32
+ .hw-pagination .hw-button:is(:disabled, [aria-disabled='true']) { color: var(--hw-color-on-disabled); background: transparent; border-color: transparent; opacity: .5; cursor: not-allowed; }
33
+ .hw-pagination .hw-pagination-gap-trigger[aria-disabled='true'] { color: var(--hw-color-on-disabled); opacity: .5; cursor: not-allowed; }
34
+ .hw-pagination :is(.hw-pagination-item, .hw-pagination-arrow, .hw-pagination-gap-trigger, [data-hw-page]):focus-visible:not(:disabled, [aria-disabled='true']) { outline: 2px solid var(--hw-color-focus-contrast); outline-offset: 2px; background: var(--hw-color-surface-muted); }
35
+ .hw-pagination-arrow::before { content: ''; inline-size: 18px; block-size: 18px; background: currentColor; mask: url('./assets/pagination-arrow.svg') center / contain no-repeat; transform: scaleX(var(--_nq-inline-sign, 1)); }
36
+ .hw-pagination-arrow[data-hw-previous]::before { transform: scaleX(calc(-1 * var(--_nq-inline-sign, 1))); }
37
+ .hw-pagination-gap { position: static; }
38
+ .hw-pagination-gap-trigger { list-style: none; }
39
+ .hw-pagination-gap-trigger::-webkit-details-marker { display: none; }
40
+ .hw-pagination-ellipsis { cursor: default; }
41
+ .hw-pagination-menu {
42
+ position: absolute; z-index: 5; inset-block-start: calc(100% + 4px); inset-inline: 0; margin-inline: auto;
43
+ inline-size: max-content; min-inline-size: 80px; max-inline-size: 100%; max-block-size: 300px; overflow-y: auto;
44
+ box-sizing: border-box; padding: 8px 0; border: 1px solid var(--hw-color-pagination-menu-border);
45
+ border-radius: 4px; background: var(--hw-color-surface); box-shadow: var(--hw-shadow-pagination);
46
+ }
47
+ .hw-pagination-gap:not([open]) > .hw-pagination-menu { display: none; }
48
+ .hw-pagination .hw-pagination-menu > .hw-pagination-item {
49
+ display: flex; inline-size: 100%; min-block-size: 40px; block-size: 40px; padding-inline: 16px;
50
+ border: 0; border-radius: 0; font-size: 14px; transition-duration: var(--hw-duration-pagination-item);
51
+ }
52
+ .hw-pagination .hw-pagination-menu > .hw-pagination-item:focus-visible { outline-color: var(--hw-color-focus); outline-offset: -2px; }
53
+ .hw-pagination-jump { display: grid; gap: .5rem; padding: .5rem; inline-size: 12rem; max-inline-size: 100%; box-sizing: border-box; }
54
+ .hw-pagination-jump .hw-label { display: grid; gap: .5rem; margin: 0; }
55
+ .hw-pagination-jump .hw-input { min-inline-size: 0; inline-size: 100%; }
56
+ @media (max-width: 576px) {
57
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) { --hw-profile-page-size: 30px; }
58
+ .hw-pagination { gap: 6px; }
59
+ .hw-pagination :is(.hw-pagination-item, .hw-pagination-arrow, .hw-pagination-gap-trigger, [data-hw-page], .hw-pagination-ellipsis) { font-size: 12px; }
60
+ .hw-pagination .hw-pagination-arrow { min-inline-size: 40px; min-block-size: 40px; block-size: 40px; }
61
+ .hw-pagination .hw-pagination-gap-trigger { min-inline-size: 40px; }
62
+ .hw-pagination-arrow::before { inline-size: 16px; block-size: 16px; }
63
+ }
64
+ @media (prefers-reduced-motion: reduce) {
65
+ .hw-pagination :is(.hw-pagination-item, .hw-pagination-arrow, .hw-pagination-gap-trigger, [data-hw-page]) { transition: none; }
66
+ }
67
+ @media (forced-colors: active) {
68
+ .hw-pagination-arrow::before { background: ButtonText; forced-color-adjust: none; }
69
+ .hw-pagination-arrow:disabled::before { background: GrayText; }
70
+ .hw-pagination [aria-current='page'] { outline: 2px solid Highlight; outline-offset: -2px; }
71
+ .hw-pagination [aria-current='page']::after { background: Highlight; forced-color-adjust: none; }
72
+ .hw-pagination-menu { border-color: CanvasText; }
73
+ }
@@ -0,0 +1,53 @@
1
+ /* NIC global.css 3427–3502: 30px stars and a 200ms fractional-fill transition.
2
+ Native radio targets, visible boundaries and direction-aware fill are Hawiyah
3
+ accessibility adaptations. See docs/nic-rating.md. */
4
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
5
+ --hw-profile-rating-size: 30px;
6
+ }
7
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
8
+ --hw-profile-rating-size: initial;
9
+ }
10
+ .hw-rating label > span[aria-hidden='true'] {
11
+ font-size: var(--hw-profile-rating-size, 1.75rem);
12
+ color: var(--hw-color-rating-empty);
13
+ -webkit-text-stroke: .5px var(--hw-color-rating-outline);
14
+ transition: color var(--hw-duration-rating) ease;
15
+ }
16
+ .hw-rating label:is(:has(input:checked), :has(~ label input:checked)) > span[aria-hidden='true'] {
17
+ color: var(--hw-color-rating-fill); -webkit-text-stroke-color: currentColor;
18
+ }
19
+ @media (hover: hover) {
20
+ .hw-rating:not([data-hw-readonly='true']):not([aria-readonly='true']):has(label:hover input:not(:disabled)) label > span[aria-hidden='true'] {
21
+ color: var(--hw-color-rating-empty); -webkit-text-stroke-color: var(--hw-color-rating-outline);
22
+ }
23
+ .hw-rating:not([data-hw-readonly='true']):not([aria-readonly='true']):has(label:hover input:not(:disabled)) label:is(:hover, :has(~ label:hover input:not(:disabled))) > span[aria-hidden='true'] {
24
+ color: var(--hw-color-rating-fill); -webkit-text-stroke-color: currentColor;
25
+ }
26
+ }
27
+ .hw-rating-display { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hw-space-2); max-inline-size: 100%; }
28
+ .hw-rating-stars { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; min-inline-size: 0; }
29
+ .hw-rating-star {
30
+ position: relative; display: inline-block; flex: none;
31
+ inline-size: var(--hw-profile-rating-size, 1.75rem); block-size: var(--hw-profile-rating-size, 1.75rem);
32
+ font-family: sans-serif; font-size: var(--hw-profile-rating-size, 1.75rem);
33
+ font-weight: 400; line-height: var(--hw-profile-rating-size, 1.75rem); text-align: center;
34
+ color: var(--hw-color-rating-empty); -webkit-text-stroke: .5px var(--hw-color-rating-outline);
35
+ }
36
+ .hw-rating-fill {
37
+ position: absolute; inset-inline-start: 0; inset-block-start: 0;
38
+ inline-size: clamp(0%, var(--hw-rating-fill, 0%), 100%); block-size: 100%;
39
+ overflow: hidden; color: var(--hw-color-rating-fill); -webkit-text-stroke-color: currentColor;
40
+ transition: inline-size var(--hw-duration-rating) ease;
41
+ }
42
+ .hw-rating-fill::before {
43
+ content: '★'; position: absolute; inset-inline-start: 0; inset-block-start: 0;
44
+ inline-size: var(--hw-profile-rating-size, 1.75rem); block-size: 100%;
45
+ }
46
+ .hw-rating-score { font-weight: var(--hw-weight-bold); color: var(--hw-color-text); direction: ltr; unicode-bidi: isolate; }
47
+ @media (prefers-reduced-motion: reduce) {
48
+ .hw-rating label > span[aria-hidden='true'], .hw-rating-fill { transition: none; }
49
+ }
50
+ @media (forced-colors: active) {
51
+ .hw-rating-star { color: Canvas; -webkit-text-stroke-color: CanvasText; forced-color-adjust: none; }
52
+ .hw-rating-fill { color: Highlight; -webkit-text-stroke-color: Highlight; forced-color-adjust: none; }
53
+ }
@@ -0,0 +1,70 @@
1
+ /* NIC global.css 2148–2312. Scoped free-text search composition; see docs/nic-search.md. */
2
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
3
+ --hw-profile-search-input-start: 12px;
4
+ --hw-profile-search-clear-size: 18px;
5
+ --hw-profile-search-clear-hover: var(--hw-color-danger);
6
+ --hw-profile-search-duration: 200ms;
7
+ }
8
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
9
+ --hw-profile-search-input-start: initial;
10
+ --hw-profile-search-clear-size: initial;
11
+ --hw-profile-search-clear-hover: initial;
12
+ --hw-profile-search-duration: initial;
13
+ }
14
+ .hw-search-field { min-inline-size: 0; }
15
+ .hw-search-control > .hw-input { padding-inline-start: var(--hw-profile-search-input-start, var(--hw-space-4)); border-radius: var(--hw-profile-control-radius, var(--hw-radius-md)); }
16
+ .hw-search-control > .hw-search-clear {
17
+ display: grid; place-items: center; color: var(--hw-color-search-clear, var(--hw-color-text-muted));
18
+ transition: color var(--hw-profile-search-duration, var(--hw-duration-fast)) ease, background-color var(--hw-profile-search-duration, var(--hw-duration-fast)) ease;
19
+ }
20
+ .hw-search-control > .hw-search-clear:hover:not(:disabled) { color: var(--hw-profile-search-clear-hover, var(--hw-color-text)); }
21
+ .hw-search-clear-icon { inline-size: var(--hw-profile-search-clear-size, 20px); block-size: var(--hw-profile-search-clear-size, 20px); }
22
+ .hw-search-control > .hw-search-suggestions {
23
+ position: absolute; z-index: 10; inset-block-start: calc(100% + 4px); inset-inline: 0;
24
+ box-sizing: border-box; margin: 0; padding: 0; list-style: none;
25
+ max-block-size: 280px; overflow-y: auto; overscroll-behavior: contain;
26
+ background: var(--hw-color-surface); color: var(--hw-color-text-muted);
27
+ border: 1px solid var(--hw-color-search-suggestion-border, var(--hw-color-border)); border-radius: 8px;
28
+ box-shadow: var(--hw-search-suggestion-shadow, 0 8px 24px rgb(16 24 40 / .12));
29
+ }
30
+ .hw-search-control > .hw-search-suggestions[hidden] { display: none; }
31
+ .hw-search-option {
32
+ box-sizing: border-box; min-block-size: 40px; padding: 10px 14px;
33
+ font: inherit; font-size: 14px; line-height: 1.4; color: var(--hw-color-text-muted);
34
+ border-block-end: 1px solid var(--hw-color-surface-muted); cursor: pointer; overflow-wrap: anywhere;
35
+ }
36
+ .hw-search-option:last-child { border-block-end: 0; }
37
+ .hw-search-option:hover, .hw-search-option[aria-selected='true'] { background: var(--hw-color-surface-muted); }
38
+ .hw-search-option[aria-selected='true'] { outline: 2px solid var(--hw-color-focus-contrast); outline-offset: -2px; }
39
+ .hw-search-option strong { color: var(--hw-color-primary-text); font-weight: 700; }
40
+ .hw-search-submit { flex: none; display: inline-flex; align-items: center; justify-content: center; inline-size: var(--hw-control-height); min-inline-size: var(--hw-control-height); padding: 0; }
41
+ .hw-search-submit-icon { display: inline-block; flex: none; inline-size: 24px; block-size: 24px; background: currentColor; mask: url('./assets/icons/search-01.svg') center / contain no-repeat; }
42
+ .hw-search-form { display: flex; align-items: start; gap: 16px; min-inline-size: 0; }
43
+ .hw-search-form > :is(.hw-field, .hw-search-field, hw-search-field) { flex: 1; min-inline-size: 0; }
44
+ .hw-search-form > .hw-search-submit { align-self: end; }
45
+ .hw-search-terms { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-block: 16px; }
46
+ .hw-search-terms > :is(h3, h4) { flex: 0 0 100%; margin: 0 0 4px; font-size: 14px; line-height: 1.5; font-weight: 600; color: var(--hw-color-text-muted); }
47
+ .hw-search-term {
48
+ display: inline-block; box-sizing: border-box; padding: 6px 14px; margin: 0; font: inherit; font-size: 13px; line-height: 1.4;
49
+ border-radius: 20px; border: 1px solid var(--hw-color-search-term-border, var(--hw-color-border));
50
+ background: var(--hw-color-primary-subtle); color: var(--hw-color-primary-text); text-decoration: none; cursor: pointer;
51
+ transition: background-color 200ms ease, border-color 200ms ease, color 200ms ease;
52
+ }
53
+ .hw-search-term:is(:hover, :focus) { background: var(--hw-color-primary); border-color: var(--hw-color-primary); color: var(--hw-color-on-primary); text-decoration: none; }
54
+ .hw-search-advanced { display: flex; justify-content: center; }
55
+ .hw-search-advanced > :is(a, button) {
56
+ display: inline-block; box-sizing: border-box; margin-block-start: 16px; padding: 10px 28px; border-radius: 6px;
57
+ font: inherit; font-size: 16px; line-height: 28px; background: var(--hw-color-primary); border: 1px solid var(--hw-color-primary); color: var(--hw-color-on-primary); text-decoration: none; cursor: pointer;
58
+ transition: background-color 200ms ease, border-color 200ms ease;
59
+ }
60
+ .hw-search-advanced > :is(a, button):is(:hover, :focus) { background: var(--hw-color-primary-hover); border-color: var(--hw-color-primary-hover); color: var(--hw-color-on-primary); text-decoration: none; }
61
+ .hw-search-term:focus-visible, .hw-search-advanced > :is(a, button):focus-visible { outline: 2px solid var(--hw-color-focus-contrast); outline-offset: 2px; }
62
+ @media (prefers-reduced-motion: reduce) {
63
+ .hw-search-control > .hw-search-clear, .hw-search-term, .hw-search-advanced > :is(a, button) { transition: none; }
64
+ }
65
+ @media (forced-colors: active) {
66
+ .hw-search-control > .hw-search-clear, .hw-search-option, .hw-search-option strong { color: CanvasText; }
67
+ .hw-search-submit-icon { forced-color-adjust: none; background: ButtonText; }
68
+ .hw-search-option[aria-selected='true'] { outline: 2px solid Highlight; outline-offset: -2px; }
69
+ .hw-search-term, .hw-search-advanced > :is(a, button) { border-color: ButtonText; }
70
+ }
@@ -0,0 +1,117 @@
1
+ /* NIC global.css 1294–1386. See docs/nic-segmented.md for cascade,
2
+ disabled, dark-mode and focus adaptations. Calendar switches are separate. */
3
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
4
+ --hw-profile-segment-gap: 0px;
5
+ --hw-profile-segment-group-padding: 0px 0.5rem;
6
+ --hw-profile-segment-group-border: 0px;
7
+ --hw-profile-segment-group-background: transparent;
8
+ --hw-profile-segment-min-width: 4.75rem;
9
+ --hw-profile-segment-padding: 0.375rem 0.75rem;
10
+ --hw-profile-segment-font: 1rem;
11
+ --hw-profile-segment-leading: 1.5rem;
12
+ --hw-profile-segment-radius: 0px;
13
+ --hw-profile-segment-outer-radius: 0.5rem;
14
+ --hw-profile-segment-border: 0px;
15
+ --hw-profile-segment-selected-border: transparent;
16
+ --hw-profile-segment-selected-shadow: none;
17
+ --hw-profile-segment-separator: 1px;
18
+ --hw-profile-segment-transition: none;
19
+ --hw-profile-segment-focus-width: 2px;
20
+ --hw-profile-segment-focus-offset: -3px;
21
+ --hw-profile-segment-mobile-height: 3rem;
22
+ --hw-profile-segment-mobile-padding: 1.25rem;
23
+ --hw-profile-segment-mobile-width: 100%;
24
+ --hw-profile-segment-mobile-flex: 1 1 auto;
25
+ }
26
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
27
+ --hw-profile-segment-gap: initial;
28
+ --hw-profile-segment-group-padding: initial;
29
+ --hw-profile-segment-group-border: initial;
30
+ --hw-profile-segment-group-background: initial;
31
+ --hw-profile-segment-min-width: initial;
32
+ --hw-profile-segment-padding: initial;
33
+ --hw-profile-segment-font: initial;
34
+ --hw-profile-segment-leading: initial;
35
+ --hw-profile-segment-radius: initial;
36
+ --hw-profile-segment-outer-radius: initial;
37
+ --hw-profile-segment-border: initial;
38
+ --hw-profile-segment-selected-border: initial;
39
+ --hw-profile-segment-selected-shadow: initial;
40
+ --hw-profile-segment-separator: initial;
41
+ --hw-profile-segment-transition: initial;
42
+ --hw-profile-segment-focus-width: initial;
43
+ --hw-profile-segment-focus-offset: initial;
44
+ --hw-profile-segment-mobile-height: initial;
45
+ --hw-profile-segment-mobile-padding: initial;
46
+ --hw-profile-segment-mobile-width: initial;
47
+ --hw-profile-segment-mobile-flex: initial;
48
+ }
49
+ .hw-toggle-group:not([data-variant='outline']) {
50
+ gap: var(--hw-profile-segment-gap, var(--hw-space-1));
51
+ padding: var(--hw-profile-segment-group-padding, var(--hw-space-1));
52
+ border-width: var(--hw-profile-segment-group-border, 1px);
53
+ background: var(--hw-profile-segment-group-background, var(--hw-color-surface-muted));
54
+ }
55
+ .hw-toggle-group:not([data-variant='outline']) > :is(button,label) {
56
+ box-sizing: border-box; min-inline-size: var(--hw-profile-segment-min-width, 0px); min-block-size: var(--hw-control-height-sm);
57
+ padding: var(--hw-profile-segment-padding, var(--hw-space-1) var(--hw-space-3));
58
+ border-width: var(--hw-profile-segment-border, 1px); border-radius: var(--hw-profile-segment-radius, var(--hw-radius-sm));
59
+ background: transparent; color: var(--hw-dga-on, var(--hw-color-text-muted)) var(--hw-dga-off, var(--hw-color-text));
60
+ font-family: var(--hw-font-sans); font-size: var(--hw-profile-segment-font, var(--hw-text-sm));
61
+ line-height: var(--hw-profile-segment-leading, var(--hw-leading-normal)); font-weight: var(--hw-weight-medium);
62
+ box-shadow: none; transition: var(--hw-profile-segment-transition, background-color var(--hw-duration-fast));
63
+ }
64
+ .hw-toggle-group:not([data-variant='outline']) > :is(button,label):first-of-type { border-start-start-radius: var(--hw-profile-segment-outer-radius, var(--hw-radius-sm)); border-end-start-radius: var(--hw-profile-segment-outer-radius, var(--hw-radius-sm)); }
65
+ .hw-toggle-group:not([data-variant='outline']) > :is(button,label):last-of-type { border-start-end-radius: var(--hw-profile-segment-outer-radius, var(--hw-radius-sm)); border-end-end-radius: var(--hw-profile-segment-outer-radius, var(--hw-radius-sm)); }
66
+ .hw-toggle-group:not([data-variant='outline']) > :is(button,label) + :is(button,label)::before { content:''; pointer-events:none; position:absolute; inset-block:0; inset-inline-start:0; inline-size:var(--hw-profile-segment-separator,0px); background:var(--hw-color-border); }
67
+ .hw-toggle-group:not([data-variant='outline']) > :is(button,label):hover:not(:disabled,[aria-disabled='true'],:has(input:disabled,input[readonly]),[aria-pressed='true'],:has(input:checked)) { background:var(--hw-dga-on,transparent) var(--hw-dga-off,var(--hw-color-segment-hover)); color:var(--hw-dga-on,var(--hw-color-primary-text)) var(--hw-dga-off,var(--hw-color-text)); }
68
+ .hw-toggle-group:not([data-variant='outline']) > :is([aria-pressed='true'],label:has(input:checked)) {
69
+ background:var(--hw-color-segment-selected); color:var(--hw-color-on-segment-selected);
70
+ border-color:var(--hw-profile-segment-selected-border,var(--hw-color-border)); box-shadow:var(--hw-profile-segment-selected-shadow,var(--hw-shadow-sm));
71
+ }
72
+ .hw-toggle-group:not([data-variant='outline']) > :is(button,label):active:not(:disabled,[aria-disabled='true'],:has(input:disabled,input[readonly])) { background:var(--hw-color-segment-selected); color:var(--hw-color-on-segment-selected); box-shadow:none; }
73
+ .hw-toggle-group:not([data-variant='outline']) > :is([aria-pressed='true'],label:has(input:checked),:active)::before,
74
+ .hw-toggle-group:not([data-variant='outline']) > :is([aria-pressed='true'],label:has(input:checked),:active) + :is(button,label)::before { opacity:0; }
75
+ /* A focus ring stays visible on selected and read-only choices. */
76
+ .hw-toggle-group:not([data-variant='outline']) > :is(button:focus-visible,label:has(input:focus-visible)) {
77
+ background:var(--hw-color-segment-selected); color:var(--hw-color-on-segment-selected);
78
+ outline:var(--hw-profile-segment-focus-width,var(--hw-focus-width)) solid var(--hw-dga-on,var(--hw-color-focus)) var(--hw-dga-off,var(--hw-color-on-segment-selected));
79
+ outline-offset:var(--hw-profile-segment-focus-offset,1px); z-index:1;
80
+ }
81
+ .hw-toggle-group:not([data-variant='outline']) > :is(button:disabled,label:has(input:disabled)) { background:var(--hw-color-disabled); color:var(--hw-color-on-disabled); box-shadow:none; cursor:not-allowed; }
82
+ .hw-toggle-group:not([data-variant='outline']) > :is(button:disabled[aria-pressed='true'],label:has(input:disabled:checked)) { outline:1px solid var(--hw-color-border-strong); outline-offset:-1px; }
83
+ @media (max-width:576px) {
84
+ .hw-toggle-group:not([data-variant='outline']) { inline-size:var(--hw-profile-segment-mobile-width,auto); }
85
+ .hw-toggle-group:not([data-variant='outline']) > :is(button,label) { flex:var(--hw-profile-segment-mobile-flex,0 1 auto); min-block-size:var(--hw-profile-segment-mobile-height,var(--hw-control-height-sm)); padding-inline:var(--hw-profile-segment-mobile-padding,var(--hw-space-3)); }
86
+ }
87
+ @media (prefers-reduced-motion:reduce) { .hw-toggle-group > :is(button,label) { transition:none; } }
88
+ @media (forced-colors:active) {
89
+ .hw-toggle-group:not([data-variant='outline']) > :is(button,label) { background:Canvas; color:CanvasText; border:1px solid ButtonText; }
90
+ .hw-toggle-group:not([data-variant='outline']) > :is([aria-pressed='true'],label:has(input:checked)) { background:Highlight; color:HighlightText; outline:2px solid Highlight; outline-offset:-2px; }
91
+ .hw-toggle-group:not([data-variant='outline']) > :is(button:focus-visible,label:has(input:focus-visible)) { outline:2px solid Highlight; outline-offset:2px; }
92
+ .hw-toggle-group:not([data-variant='outline']) > :is(button:disabled,label:has(input:disabled)) { color:GrayText; background:Canvas; border-color:GrayText; }
93
+ }
94
+ /* Attached action groups keep ordinary button semantics. Support Angular's
95
+ native IconButton wrapper without reparenting framework-owned content. */
96
+ .hw-button-group > hw-icon-button { display:inline-flex; }
97
+ .hw-button-group[data-variant='attached'] > hw-icon-button > .hw-button { inline-size:100%; }
98
+ .hw-button-group[data-variant='attached'] > :is(.hw-button,hw-icon-button) + :is(.hw-button,hw-icon-button) { margin-inline-start:-1px; }
99
+ .hw-button-group[data-variant='attached'] > hw-icon-button:not(:first-child) > .hw-button { border-start-start-radius:0; border-end-start-radius:0; }
100
+ .hw-button-group[data-variant='attached'] > hw-icon-button:not(:last-child) > .hw-button { border-start-end-radius:0; border-end-end-radius:0; }
101
+ .hw-button-group[data-variant='attached'][data-orientation='vertical'] > :is(.hw-button,hw-icon-button) { margin-inline:0; }
102
+ .hw-button-group[data-variant='attached'][data-orientation='vertical'] > :is(.hw-button,hw-icon-button) + :is(.hw-button,hw-icon-button) { margin-block-start:-1px; }
103
+ .hw-button-group[data-variant='attached'][data-orientation='vertical'] > .hw-button,
104
+ .hw-button-group[data-variant='attached'][data-orientation='vertical'] > hw-icon-button > .hw-button { border-radius:0; }
105
+ .hw-button-group[data-variant='attached'][data-orientation='vertical'] > .hw-button:first-child,
106
+ .hw-button-group[data-variant='attached'][data-orientation='vertical'] > hw-icon-button:first-child > .hw-button { border-start-start-radius:var(--hw-profile-control-radius,var(--hw-radius-md)); border-start-end-radius:var(--hw-profile-control-radius,var(--hw-radius-md)); }
107
+ .hw-button-group[data-variant='attached'][data-orientation='vertical'] > .hw-button:last-child,
108
+ .hw-button-group[data-variant='attached'][data-orientation='vertical'] > hw-icon-button:last-child > .hw-button { border-end-start-radius:var(--hw-profile-control-radius,var(--hw-radius-md)); border-end-end-radius:var(--hw-profile-control-radius,var(--hw-radius-md)); }
109
+ .hw-button-group > hw-icon-button:has(:focus-visible) { position:relative; z-index:1; }
110
+
111
+ /* Read-only pressed buttons remain keyboard stops, including outline mode. */
112
+ .hw-toggle-group[data-hw-readonly='true'][data-variant='outline'] > button[aria-disabled='true']:focus-visible:not(:disabled) {
113
+ outline:var(--hw-focus-width) solid var(--hw-color-focus); outline-offset:2px;
114
+ }
115
+ @media (forced-colors:active) {
116
+ .hw-toggle-group[data-hw-readonly='true'][data-variant='outline'] > button[aria-disabled='true']:focus-visible:not(:disabled) { outline:2px solid Highlight; }
117
+ }
@@ -0,0 +1,51 @@
1
+ /* NIC global.css 2439–2446, 2497–2527 and 2641–2649.
2
+ Keep the native picker and draw its indicator independently of the focus line. */
3
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
4
+ --hw-profile-select-down: , url('./assets/select-down.svg');
5
+ --hw-profile-select-up: , url('./assets/select-up.svg');
6
+ --hw-profile-select-size: , 18px 18px;
7
+ --hw-profile-select-position-ltr: , right 10px center;
8
+ --hw-profile-select-position-rtl: , left 12px center;
9
+ --hw-profile-select-appearance: none;
10
+ --hw-profile-select-font: .875rem;
11
+ --hw-profile-select-padding-ltr: 35px;
12
+ --hw-profile-select-padding-rtl: 36px;
13
+ --hw-profile-helper-size: .625rem;
14
+ --hw-profile-error-size: .75rem;
15
+ --hw-profile-error-offset: -.25rem;
16
+ }
17
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
18
+ --hw-profile-select-down: initial;
19
+ --hw-profile-select-up: initial;
20
+ --hw-profile-select-size: initial;
21
+ --hw-profile-select-position-ltr: initial;
22
+ --hw-profile-select-position-rtl: initial;
23
+ --hw-profile-select-appearance: initial;
24
+ --hw-profile-select-font: initial;
25
+ --hw-profile-select-padding-ltr: initial;
26
+ --hw-profile-select-padding-rtl: initial;
27
+ --hw-profile-helper-size: initial;
28
+ --hw-profile-error-size: initial;
29
+ --hw-profile-error-offset: initial;
30
+ }
31
+ @media (forced-colors: none) {
32
+ select.hw-select:where(:not([multiple]):is(:not([size]), [size='0'], [size='1'])) {
33
+ appearance: var(--hw-profile-select-appearance, auto);
34
+ --_nq-select-image: var(--hw-profile-select-down,);
35
+ --_nq-select-size: var(--hw-profile-select-size,);
36
+ --_nq-rtl-position: var(--_nq-rtl-only) var(--hw-profile-select-position-rtl,);
37
+ --_nq-select-position: var(--_nq-rtl-position, var(--hw-profile-select-position-ltr,));
38
+ --_nq-rtl-padding: var(--_nq-rtl-only) var(--hw-profile-select-padding-rtl, var(--hw-space-3));
39
+ --hw-profile-field-padding-end: var(--_nq-rtl-padding, var(--hw-profile-select-padding-ltr, var(--hw-space-3)));
40
+ font-size: var(--hw-profile-select-font, inherit);
41
+ }
42
+ select.hw-select:where(:not([multiple]):is(:not([size]), [size='0'], [size='1'])):focus { --_nq-select-image: var(--hw-profile-select-up,); }
43
+ }
44
+ .hw-field > .hw-hint { color: var(--hw-color-field-helper, var(--hw-color-text-muted)); font-size: var(--hw-profile-helper-size, var(--hw-text-sm)); }
45
+ .hw-field > .hw-error {
46
+ color: var(--hw-color-field-error-text, var(--hw-color-danger));
47
+ font-size: var(--hw-profile-error-size, var(--hw-text-sm));
48
+ margin-block-start: var(--hw-profile-error-offset, 0);
49
+ }
50
+
51
+ .hw-label > .hw-required-marker { color: var(--hw-color-danger); }