@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,129 @@
1
+ /* CSS-only responsive layout. Every boundary resets local options, so a nested
2
+ layout does not inherit its parent's breakpoint columns or padding. */
3
+ :where(.hw-container, .hw-stack, .hw-inline, .hw-grid, .hw-columns,
4
+ .hw-sidebar, .hw-center, .hw-spacer, .hw-aspect-ratio, .hw-section,
5
+ .hw-app-shell, .hw-page-header) {
6
+ --hw-layout-gap: var(--hw-gap, var(--hw-space-4));
7
+ --hw-layout-gap-sm: initial;
8
+ --hw-layout-gap-md: initial;
9
+ --hw-layout-gap-lg: initial;
10
+ --hw-layout-gap-xl: initial;
11
+ --hw-layout-padding: 0px;
12
+ --hw-layout-padding-sm: initial;
13
+ --hw-layout-padding-md: initial;
14
+ --hw-layout-padding-lg: initial;
15
+ --hw-layout-padding-xl: initial;
16
+ --hw-layout-columns: 1;
17
+ --hw-layout-columns-sm: initial;
18
+ --hw-layout-columns-md: initial;
19
+ --hw-layout-columns-lg: initial;
20
+ --hw-layout-columns-xl: initial;
21
+ --hw-layout-align: stretch;
22
+ --hw-layout-justify: start;
23
+ --hw-layout-wrap: wrap;
24
+ --hw-layout-min-item: 0px;
25
+ --hw-layout-sidebar-width: 18rem;
26
+ --hw-layout-max-width: var(--hw-content-max);
27
+ --hw-layout-ratio: 1.777777778;
28
+ --hw-layout-current-gap: var(--hw-layout-gap);
29
+ --hw-layout-current-padding: var(--hw-layout-padding);
30
+ --hw-layout-current-columns: var(--hw-layout-columns);
31
+ box-sizing: border-box;
32
+ min-inline-size: 0;
33
+ gap: var(--hw-layout-current-gap);
34
+ padding: var(--hw-layout-current-padding);
35
+ font-family: var(--hw-font-sans);
36
+ }
37
+ :where(.hw-stack, .hw-inline, .hw-grid, .hw-columns, .hw-sidebar, .hw-app-shell) > * { min-inline-size: 0; }
38
+ .hw-container { inline-size: min(var(--hw-layout-max-width), calc(100% - 2 * var(--hw-content-gutter, 1.5rem))); margin-inline: auto; }
39
+ .hw-container[data-variant='fluid'] { inline-size: 100%; }
40
+ /* Mobile gutter is a layout policy; the reference frame widths are not
41
+ themselves breakpoints. Figma variable 50:3/4/5: 1280 / 32 / 16px. */
42
+ @media (max-width: 37.499rem) {
43
+ .hw-container:not([data-variant='fluid']) { inline-size: min(var(--hw-layout-max-width), calc(100% - 2 * var(--hw-content-gutter-mobile, 1rem))); }
44
+ }
45
+ .hw-stack { display: flex; flex-direction: column; flex-wrap: nowrap; align-items: var(--hw-layout-align); justify-content: var(--hw-layout-justify); gap: var(--hw-layout-current-gap); }
46
+ .hw-inline { --hw-layout-align: center; display: flex; flex-direction: row; flex-wrap: var(--hw-layout-wrap); align-items: var(--hw-layout-align); justify-content: var(--hw-layout-justify); }
47
+ .hw-grid, .hw-columns {
48
+ display: grid;
49
+ grid-template-columns: repeat(var(--hw-layout-current-columns), minmax(min(100%, var(--hw-layout-min-item)), 1fr));
50
+ align-items: var(--hw-layout-align);
51
+ justify-content: var(--hw-layout-justify);
52
+ }
53
+ .hw-sidebar { display: grid; grid-template-columns: minmax(0, 1fr); align-items: var(--hw-layout-align); }
54
+ .hw-center { --hw-layout-align: center; --hw-layout-justify: center; display: flex; flex-direction: column; align-items: var(--hw-layout-align); justify-content: var(--hw-layout-justify); text-align: center; }
55
+ .hw-spacer { --hw-layout-gap: 0px; flex: 1 1 0%; min-inline-size: var(--hw-layout-current-gap); min-block-size: var(--hw-layout-current-gap); pointer-events: none; }
56
+ .hw-aspect-ratio { position: relative; inline-size: 100%; aspect-ratio: var(--hw-layout-ratio); overflow: hidden; }
57
+ .hw-aspect-ratio > :is(img, video, iframe, canvas) { display: block; inline-size: 100%; block-size: 100%; border: 0; object-fit: cover; }
58
+ .hw-aspect-ratio[data-fit='contain'] > :is(img, video) { object-fit: contain; }
59
+ .hw-section { --hw-layout-padding: var(--hw-space-6); }
60
+ .hw-section[data-tone='muted'] { background: var(--hw-color-surface-muted); color: var(--hw-color-text); }
61
+ .hw-section[data-tone='brand'] { background: var(--hw-color-primary-subtle); color: var(--hw-color-primary-text); }
62
+ .hw-app-shell { position: relative; --hw-layout-gap: 0px; display: grid; grid-template-areas: 'header' 'sidebar' 'main' 'footer'; grid-template-columns: minmax(0, 1fr); grid-template-rows: auto auto 1fr auto; min-block-size: 100dvh; background: var(--hw-color-canvas); color: var(--hw-color-text); }
63
+ .hw-app-shell > :is(header, .hw-app-shell-header) { grid-area: header; }
64
+ .hw-app-shell > :is(aside, nav, .hw-app-shell-sidebar) { grid-area: sidebar; }
65
+ .hw-app-shell > :is(main, .hw-app-shell-main) { grid-area: main; }
66
+ .hw-app-shell > :is(footer, .hw-app-shell-footer) { grid-area: footer; }
67
+ /* Angular projection leaves empty region elements when callers omit a slot. */
68
+ .hw-app-shell > :is(.hw-app-shell-header, .hw-app-shell-sidebar, .hw-app-shell-footer):empty { display: none; }
69
+ .hw-app-shell-sidebar { padding: var(--hw-space-5); border-block-end: 1px solid var(--hw-color-border); background: var(--hw-color-surface); }
70
+ .hw-app-shell-main { padding: clamp(1rem, 3vw, 3rem); }
71
+ .hw-page-header { --hw-layout-align: start; --hw-layout-justify: space-between; display: flex; flex-wrap: var(--hw-layout-wrap); align-items: var(--hw-layout-align); justify-content: var(--hw-layout-justify); color: var(--hw-color-text); }
72
+ .hw-page-header-content, .hw-page-header > :first-child:not(.hw-page-header-actions) { flex: 1 1 16rem; min-inline-size: 0; }
73
+ .hw-page-header :is(h1, h2) { margin: 0; font-size: clamp(var(--hw-text-xl), 3vw, var(--hw-text-3xl)); font-weight: var(--hw-weight-semibold); line-height: var(--hw-leading-heading); }
74
+ .hw-page-header p { max-inline-size: 65ch; margin-block: var(--hw-space-2) 0; color: var(--hw-color-text-muted); }
75
+ .hw-page-header-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hw-space-3); }
76
+ @media (min-width: 40rem) {
77
+ :where(.hw-container, .hw-stack, .hw-inline, .hw-grid, .hw-columns, .hw-sidebar, .hw-center, .hw-spacer, .hw-aspect-ratio, .hw-section, .hw-app-shell, .hw-page-header) {
78
+ --hw-layout-current-gap: var(--hw-layout-gap-sm, var(--hw-layout-gap));
79
+ --hw-layout-current-padding: var(--hw-layout-padding-sm, var(--hw-layout-padding));
80
+ --hw-layout-current-columns: var(--hw-layout-columns-sm, var(--hw-layout-columns));
81
+ }
82
+ .hw-sidebar[data-collapse-at='sm'] { grid-template-columns: min(40%, var(--hw-layout-sidebar-width)) minmax(0, 1fr); }
83
+ .hw-sidebar[data-collapse-at='sm'][data-side='end'] { grid-template-columns: minmax(0, 1fr) min(40%, var(--hw-layout-sidebar-width)); }
84
+ .hw-sidebar[data-collapse-at='sm'][data-side='end'] > :first-child { grid-column: 2; grid-row: 1; }
85
+ .hw-sidebar[data-collapse-at='sm'][data-side='end'] > :nth-child(2) { grid-column: 1; grid-row: 1; }
86
+ }
87
+ @media (min-width: 48rem) {
88
+ :where(.hw-container, .hw-stack, .hw-inline, .hw-grid, .hw-columns, .hw-sidebar, .hw-center, .hw-spacer, .hw-aspect-ratio, .hw-section, .hw-app-shell, .hw-page-header) {
89
+ --hw-layout-current-gap: var(--hw-layout-gap-md, var(--hw-layout-gap-sm, var(--hw-layout-gap)));
90
+ --hw-layout-current-padding: var(--hw-layout-padding-md, var(--hw-layout-padding-sm, var(--hw-layout-padding)));
91
+ --hw-layout-current-columns: var(--hw-layout-columns-md, var(--hw-layout-columns-sm, var(--hw-layout-columns)));
92
+ }
93
+ .hw-sidebar:not([data-collapse-at]), .hw-sidebar[data-collapse-at='md'] { grid-template-columns: min(40%, var(--hw-layout-sidebar-width)) minmax(0, 1fr); }
94
+ .hw-sidebar:not([data-collapse-at])[data-side='end'], .hw-sidebar[data-collapse-at='md'][data-side='end'] { grid-template-columns: minmax(0, 1fr) min(40%, var(--hw-layout-sidebar-width)); }
95
+ .hw-sidebar:not([data-collapse-at])[data-side='end'] > :first-child, .hw-sidebar[data-collapse-at='md'][data-side='end'] > :first-child { grid-column: 2; grid-row: 1; }
96
+ .hw-sidebar:not([data-collapse-at])[data-side='end'] > :nth-child(2), .hw-sidebar[data-collapse-at='md'][data-side='end'] > :nth-child(2) { grid-column: 1; grid-row: 1; }
97
+ }
98
+ @media (min-width: 64rem) {
99
+ :where(.hw-container, .hw-stack, .hw-inline, .hw-grid, .hw-columns, .hw-sidebar, .hw-center, .hw-spacer, .hw-aspect-ratio, .hw-section, .hw-app-shell, .hw-page-header) {
100
+ --hw-layout-current-gap: var(--hw-layout-gap-lg, var(--hw-layout-gap-md, var(--hw-layout-gap-sm, var(--hw-layout-gap))));
101
+ --hw-layout-current-padding: var(--hw-layout-padding-lg, var(--hw-layout-padding-md, var(--hw-layout-padding-sm, var(--hw-layout-padding))));
102
+ --hw-layout-current-columns: var(--hw-layout-columns-lg, var(--hw-layout-columns-md, var(--hw-layout-columns-sm, var(--hw-layout-columns))));
103
+ }
104
+ .hw-sidebar[data-collapse-at='lg'] { grid-template-columns: min(40%, var(--hw-layout-sidebar-width)) minmax(0, 1fr); }
105
+ .hw-sidebar[data-collapse-at='lg'][data-side='end'] { grid-template-columns: minmax(0, 1fr) min(40%, var(--hw-layout-sidebar-width)); }
106
+ .hw-sidebar[data-collapse-at='lg'][data-side='end'] > :first-child { grid-column: 2; grid-row: 1; }
107
+ .hw-sidebar[data-collapse-at='lg'][data-side='end'] > :nth-child(2) { grid-column: 1; grid-row: 1; }
108
+ .hw-app-shell:has(.hw-app-shell-sidebar:not(:empty), > aside:not(:empty), > nav:not(:empty)) { grid-template-areas: 'header header' 'sidebar main' 'footer footer'; grid-template-columns: min(30%, var(--hw-layout-sidebar-width)) minmax(0, 1fr); grid-template-rows: auto 1fr auto; }
109
+ .hw-app-shell[data-side='end']:has(.hw-app-shell-sidebar:not(:empty), > aside:not(:empty), > nav:not(:empty)) { grid-template-areas: 'header header' 'main sidebar' 'footer footer'; grid-template-columns: minmax(0, 1fr) min(30%, var(--hw-layout-sidebar-width)); }
110
+ .hw-app-shell-sidebar { border-block-end: 0; border-inline-end: 1px solid var(--hw-color-border); }
111
+ .hw-app-shell[data-side='end'] .hw-app-shell-sidebar { border-inline-end: 0; border-inline-start: 1px solid var(--hw-color-border); }
112
+ }
113
+ @media (min-width: 80rem) {
114
+ :where(.hw-container, .hw-stack, .hw-inline, .hw-grid, .hw-columns, .hw-sidebar, .hw-center, .hw-spacer, .hw-aspect-ratio, .hw-section, .hw-app-shell, .hw-page-header) {
115
+ --hw-layout-current-gap: var(--hw-layout-gap-xl, var(--hw-layout-gap-lg, var(--hw-layout-gap-md, var(--hw-layout-gap-sm, var(--hw-layout-gap)))));
116
+ --hw-layout-current-padding: var(--hw-layout-padding-xl, var(--hw-layout-padding-lg, var(--hw-layout-padding-md, var(--hw-layout-padding-sm, var(--hw-layout-padding)))));
117
+ --hw-layout-current-columns: var(--hw-layout-columns-xl, var(--hw-layout-columns-lg, var(--hw-layout-columns-md, var(--hw-layout-columns-sm, var(--hw-layout-columns)))));
118
+ }
119
+ }
120
+
121
+ /* Adapters may group the body for composition; display:contents preserves the
122
+ same outer grid while the landmarks themselves remain real elements. */
123
+ .hw-app-shell-body { display: contents; }
124
+ .hw-app-shell-body > .hw-app-shell-sidebar { grid-area: sidebar; }
125
+ .hw-app-shell-body > .hw-app-shell-main { grid-area: main; }
126
+ .hw-app-shell:not(:has(.hw-app-shell-sidebar:not(:empty), > aside:not(:empty), > nav:not(:empty))) { grid-template-areas: 'header' 'main' 'footer'; grid-template-columns: minmax(0, 1fr); grid-template-rows: auto 1fr auto; }
127
+ .hw-page-header-main { display: flex; flex-wrap: wrap; align-items: var(--hw-layout-align); justify-content: var(--hw-layout-justify); gap: var(--hw-layout-current-gap); flex: 1 1 100%; min-inline-size: 0; }
128
+ .hw-page-header-main > :first-child { flex: 1 1 16rem; min-inline-size: 0; }
129
+ .hw-page-header > :is(.hw-breadcrumb, nav) { flex-basis: 100%; }
@@ -0,0 +1,10 @@
1
+ /* Inline SVGs may be display:block in a consuming reset. Keep the label and
2
+ its icon on one flex row without changing link semantics or color variants. */
3
+ .hw-link-icon, .hw-link:has(> svg, > .hw-icon) {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ gap: var(--hw-space-2);
7
+ max-inline-size: 100%;
8
+ vertical-align: middle;
9
+ }
10
+ .hw-link-icon > svg, .hw-link > :is(svg, .hw-icon) { flex: none; }
@@ -0,0 +1,43 @@
1
+ /* Mobile Components 8332:24202 / 24242 / 24282: color state changes,
2
+ not a translating indicator. Route navigation keeps native link semantics. */
3
+ .hw-secondary-nav[data-variant='mobile'] {
4
+ border: 0;
5
+ padding-block-end: env(safe-area-inset-bottom, 0px);
6
+ }
7
+ .hw-secondary-nav[data-variant='mobile'] ul {
8
+ flex-wrap: nowrap;
9
+ gap: 0;
10
+ padding: 0 0.25rem;
11
+ }
12
+ .hw-secondary-nav[data-variant='mobile'] li { flex: 1 1 0; min-inline-size: 0; }
13
+ .hw-secondary-nav[data-variant='mobile'] a {
14
+ box-sizing: border-box;
15
+ display: flex;
16
+ flex-direction: column;
17
+ justify-content: center;
18
+ gap: 0.25rem;
19
+ inline-size: 100%;
20
+ min-block-size: 4.375rem;
21
+ padding: 0.6875rem 0.5rem 0.75rem;
22
+ border-block-start: 1px solid transparent;
23
+ border-block-end: 0;
24
+ background: transparent;
25
+ color: var(--hw-color-text-muted);
26
+ font: var(--hw-weight-medium) 0.75rem / 1.5 var(--hw-font-sans);
27
+ text-align: center;
28
+ overflow-wrap: anywhere;
29
+ transition: color var(--hw-duration-tab-bar, 300ms) var(--hw-ease-tab-bar, ease-out),
30
+ border-block-start-color var(--hw-duration-tab-bar, 300ms) var(--hw-ease-tab-bar, ease-out);
31
+ }
32
+ .hw-secondary-nav[data-variant='mobile'] .hw-icon { --hw-icon-size: 1.5rem; }
33
+ .hw-secondary-nav[data-variant='mobile'] a:is(:hover, :active, [aria-current='page']) {
34
+ color: var(--hw-color-primary-text);
35
+ background: transparent;
36
+ }
37
+ .hw-secondary-nav[data-variant='mobile'] a[aria-current='page'] { border-block-start-color: currentColor; }
38
+ @media (prefers-reduced-motion: reduce) {
39
+ .hw-secondary-nav[data-variant='mobile'] a { transition: none; }
40
+ }
41
+ @media (forced-colors: active) {
42
+ .hw-secondary-nav[data-variant='mobile'] a[aria-current='page'] { border-block-start-color: LinkText; }
43
+ }
@@ -0,0 +1,15 @@
1
+ /* Mobile 8335:15564/15565 and 8335:15397/15402/15403. OS status chrome is
2
+ excluded. Intrinsic height and 44px actions are accessibility adaptations. */
3
+ .hw-mobile-top-bar { box-sizing: border-box; display: flex; flex-wrap: wrap; align-items: center; gap: var(--hw-space-2); min-inline-size: 0; inline-size: 100%; min-block-size: 3.75rem; padding-block: max(var(--hw-space-2), env(safe-area-inset-top, 0px)) var(--hw-space-2); padding-left: max(var(--hw-space-4), env(safe-area-inset-left, 0px)); padding-right: max(var(--hw-space-4), env(safe-area-inset-right, 0px)); color: var(--hw-color-text); background: var(--hw-color-surface); font-family: var(--hw-font-sans); border-block-end: 1px solid var(--hw-color-border); }
4
+ .hw-mobile-top-bar-copy { flex: 1 1 6rem; min-inline-size: 0; overflow-wrap: anywhere; }
5
+ .hw-mobile-top-bar-title { margin: 0; color: var(--hw-color-heading, var(--hw-color-text)); font-size: .875rem; line-height: 1.5; font-weight: var(--hw-weight-semibold); }
6
+ .hw-mobile-top-bar[data-variant='main'] .hw-mobile-top-bar-title { font-size: 1.625rem; font-weight: var(--hw-weight-bold, 700); }
7
+ .hw-mobile-top-bar-subtitle { margin: 0; color: var(--hw-color-text-muted); font-size: .75rem; line-height: 1.5; }
8
+ .hw-mobile-top-bar-leading, .hw-mobile-top-bar-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--hw-space-2); min-inline-size: 0; max-inline-size: 100%; }
9
+ .hw-mobile-top-bar-leading:empty, .hw-mobile-top-bar-actions:empty { display: none; }
10
+ .hw-mobile-top-bar-actions { margin-inline-start: auto; }
11
+ .hw-mobile-top-bar :is(a, button) { box-sizing: border-box; display: inline-flex; align-items: center; justify-content: center; min-inline-size: 2.75rem; min-block-size: 2.75rem; white-space: normal; overflow-wrap: anywhere; }
12
+ .hw-mobile-top-bar-back { color: inherit; text-decoration: none; border-radius: var(--hw-radius-sm); }
13
+ .hw-mobile-top-bar-back:hover { background: var(--hw-color-surface-muted); }
14
+ .hw-mobile-top-bar :is(a, button):focus-visible { outline: 2px solid var(--hw-color-focus); outline-offset: -2px; }
15
+ @media (forced-colors: active) { .hw-mobile-top-bar :is(a, button):focus-visible { outline-color: Highlight; } }
@@ -0,0 +1,104 @@
1
+ /* Mobile Nav Drawer 1679:30949 / 538:296406. Source dimensions describe
2
+ examples; content grows and the existing Drawer owns modal behavior/motion. */
3
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) {
4
+ box-sizing: border-box;
5
+ inline-size: min(20.4375rem, calc(100vw - 1rem));
6
+ max-inline-size: calc(100vw - 1rem);
7
+ color: var(--hw-color-text);
8
+ background: var(--hw-color-surface);
9
+ font-family: var(--hw-font-sans);
10
+ }
11
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) > .hw-dialog-header {
12
+ align-items: center;
13
+ gap: 0.5rem;
14
+ padding: max(1rem, env(safe-area-inset-top, 0px)) max(1rem, env(safe-area-inset-right, 0px)) 1rem max(1rem, env(safe-area-inset-left, 0px));
15
+ }
16
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) > .hw-dialog-header h2 { min-inline-size: 0; overflow-wrap: anywhere; }
17
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) > .hw-dialog-header > button {
18
+ flex: none;
19
+ min-inline-size: 2.75rem;
20
+ min-block-size: 2.75rem;
21
+ padding: 0.5rem;
22
+ font-size: 0;
23
+ }
24
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) > .hw-dialog-header > button::after {
25
+ content: '';
26
+ inline-size: 1.5rem;
27
+ block-size: 1.5rem;
28
+ background: currentColor;
29
+ mask: url('./assets/icons/cancel-01.svg') center / contain no-repeat;
30
+ }
31
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) > .hw-dialog-body {
32
+ padding: 0 max(1rem, env(safe-area-inset-right, 0px)) max(1rem, env(safe-area-inset-bottom, 0px)) max(1rem, env(safe-area-inset-left, 0px));
33
+ }
34
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) > .hw-dialog-footer {
35
+ padding: 1rem max(1rem, env(safe-area-inset-right, 0px)) max(1rem, env(safe-area-inset-bottom, 0px)) max(1rem, env(safe-area-inset-left, 0px));
36
+ }
37
+ .hw-navigation-drawer-host > hw-drawer > .hw-drawer > .hw-dialog-footer:has(> [hwDrawerFooter]:empty) { display: none; }
38
+ .hw-navigation-drawer-user { padding-block: 1rem; border-block-end: 1px solid var(--hw-color-border); overflow-wrap: anywhere; }
39
+ .hw-navigation-drawer-user:empty { display: none; }
40
+ .hw-navigation-drawer-nav { padding-block-start: 1rem; }
41
+ .hw-navigation-drawer-nav ul { list-style: none; margin: 0; padding: 0; }
42
+ .hw-navigation-drawer-nav li { min-inline-size: 0; }
43
+ .hw-navigation-drawer-row {
44
+ box-sizing: border-box;
45
+ position: relative;
46
+ display: flex;
47
+ align-items: center;
48
+ gap: 0.5rem;
49
+ min-inline-size: 0;
50
+ min-block-size: 2.75rem;
51
+ padding: 0.75rem 1rem;
52
+ border: 0;
53
+ border-radius: 0.25rem;
54
+ color: var(--hw-color-text);
55
+ background: transparent;
56
+ font: var(--hw-weight-medium) 0.875rem / 1.4286 var(--hw-font-sans);
57
+ text-decoration: none;
58
+ text-align: start;
59
+ list-style: none;
60
+ overflow-wrap: anywhere;
61
+ }
62
+ .hw-navigation-drawer-label { min-inline-size: 0; }
63
+ .hw-navigation-drawer-group > ul .hw-navigation-drawer-row { padding-inline-start: 2.5rem; }
64
+ .hw-navigation-drawer-row .hw-icon { --hw-icon-size: 1rem; }
65
+ :is(a,summary).hw-navigation-drawer-row { cursor: pointer; }
66
+ :is(a,summary).hw-navigation-drawer-row:hover { background: var(--hw-color-surface-muted); }
67
+ .hw-navigation-drawer-row[aria-current='page'] {
68
+ color: var(--hw-color-primary-text);
69
+ background: var(--hw-color-surface-muted);
70
+ font-weight: var(--hw-weight-semibold);
71
+ }
72
+ .hw-navigation-drawer-row[aria-current='page']::before {
73
+ content: '';
74
+ position: absolute;
75
+ inset-inline-start: 0;
76
+ inset-block-start: 50%;
77
+ translate: 0 -50%;
78
+ inline-size: 0.375rem;
79
+ block-size: 2rem;
80
+ border-radius: var(--hw-radius-full);
81
+ background: currentColor;
82
+ }
83
+ .hw-navigation-drawer-row:focus-visible { outline: 2px solid var(--hw-color-focus); outline-offset: -2px; }
84
+ .hw-navigation-drawer-row[aria-disabled='true'] { color: var(--hw-color-on-disabled); cursor: not-allowed; }
85
+ summary.hw-navigation-drawer-row::-webkit-details-marker { display: none; }
86
+ summary.hw-navigation-drawer-row::after {
87
+ content: '';
88
+ flex: none;
89
+ margin-inline-start: auto;
90
+ inline-size: 1rem;
91
+ block-size: 1rem;
92
+ background: currentColor;
93
+ mask: url('./assets/icons/arrow-down-01.svg') center / contain no-repeat;
94
+ }
95
+ .hw-navigation-drawer-group[open] > summary.hw-navigation-drawer-row::after { rotate: 180deg; }
96
+ @media (forced-colors: active) {
97
+ .hw-navigation-drawer-row[aria-current='page'] { color: LinkText; }
98
+ .hw-navigation-drawer-row[aria-current='page']::before { background: LinkText; forced-color-adjust: none; }
99
+ .hw-navigation-drawer-row:focus-visible { outline-color: Highlight; }
100
+ .hw-navigation-drawer-row[aria-disabled='true'] { color: GrayText; }
101
+ summary.hw-navigation-drawer-row::after,
102
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) > .hw-dialog-header > button::after { background: ButtonText; forced-color-adjust: none; }
103
+ }
104
+ :is(.hw-navigation-drawer, .hw-navigation-drawer-host > hw-drawer > .hw-drawer) > .hw-dialog-header > button:has(.hw-icon)::after { content: none; }
@@ -0,0 +1,97 @@
1
+ /* NIC global.css 1677–1766; see docs/nic-accordion.md for DOM mapping.
2
+ The source header has 16px padding + a 2px transparent border around its
3
+ button. Item padding preserves that space without adding a wrapper to summary. */
4
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
5
+ --hw-profile-accordion-radius: 0.375rem;
6
+ --hw-profile-accordion-item-padding: 1.125rem;
7
+ --hw-profile-accordion-trigger-padding: 0.75rem 1rem;
8
+ --hw-profile-accordion-trigger-leading: 1.5rem;
9
+ --hw-profile-accordion-content-padding: 1rem;
10
+ --hw-profile-accordion-content-margin: 1.125rem -1.125rem -1.125rem;
11
+ --hw-profile-accordion-surface-duration: 150ms;
12
+ --hw-profile-accordion-icon-size: 1.125rem;
13
+ --hw-profile-accordion-icon-offset: 1px;
14
+ --hw-profile-accordion-icon-content: '';
15
+ --hw-profile-accordion-icon-mask: url('./assets/icons/arrow-down-01.svg') center / contain no-repeat;
16
+ --hw-profile-accordion-icon-background: currentColor;
17
+ --hw-profile-accordion-icon-expanded: rotate(-180deg);
18
+ }
19
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
20
+ --hw-profile-accordion-radius: initial;
21
+ --hw-profile-accordion-item-padding: initial;
22
+ --hw-profile-accordion-trigger-padding: initial;
23
+ --hw-profile-accordion-trigger-leading: initial;
24
+ --hw-profile-accordion-content-padding: initial;
25
+ --hw-profile-accordion-content-margin: initial;
26
+ --hw-profile-accordion-surface-duration: initial;
27
+ --hw-profile-accordion-icon-size: initial;
28
+ --hw-profile-accordion-icon-offset: initial;
29
+ --hw-profile-accordion-icon-content: initial;
30
+ --hw-profile-accordion-icon-mask: initial;
31
+ --hw-profile-accordion-icon-background: initial;
32
+ --hw-profile-accordion-icon-expanded: initial;
33
+ }
34
+ .hw-accordion {
35
+ border-color: var(--hw-color-accordion-border);
36
+ border-radius: var(--hw-profile-accordion-radius, var(--hw-radius-lg));
37
+ }
38
+ .hw-accordion-item {
39
+ box-sizing: border-box;
40
+ padding: var(--hw-profile-accordion-item-padding, 0px);
41
+ }
42
+ .hw-accordion-item + .hw-accordion-item { border-block-start-color: var(--hw-color-accordion-border); }
43
+ .hw-accordion-trigger {
44
+ --hw-accordion-trigger-background: transparent;
45
+ padding: var(--hw-profile-accordion-trigger-padding, var(--hw-space-4) var(--hw-space-5));
46
+ line-height: var(--hw-profile-accordion-trigger-leading, inherit);
47
+ background: var(--hw-accordion-trigger-background);
48
+ overflow-anchor: none;
49
+ transition: color var(--hw-profile-accordion-surface-duration, 0ms) ease-in-out,
50
+ background-color var(--hw-profile-accordion-surface-duration, 0ms) ease-in-out;
51
+ }
52
+ .hw-accordion-trigger:hover { --hw-accordion-trigger-background: var(--hw-color-surface-muted); }
53
+ .hw-accordion-trigger:focus {
54
+ background: var(--hw-dga-on, var(--hw-accordion-trigger-background)) var(--hw-dga-off, var(--hw-color-accordion-focus));
55
+ }
56
+ .hw-accordion-trigger:focus-visible {
57
+ outline-width: var(--hw-dga-on, var(--hw-focus-width)) var(--hw-dga-off, 2px);
58
+ outline-color: var(--hw-dga-on, var(--hw-color-focus)) var(--hw-dga-off, var(--hw-color-focus-contrast));
59
+ }
60
+ .hw-accordion-item > .hw-accordion-content {
61
+ margin: var(--hw-profile-accordion-content-margin, 0px);
62
+ padding: var(--hw-profile-accordion-content-padding, 0 var(--hw-space-5) var(--hw-space-5));
63
+ color: var(--hw-dga-on, var(--hw-color-text-muted)) var(--hw-dga-off, var(--hw-color-text));
64
+ }
65
+ /* Native no-script disclosure gets the same indicator in the DGA profile. */
66
+ .hw-accordion-trigger::after {
67
+ position: relative;
68
+ top: var(--hw-profile-accordion-icon-offset, 0px);
69
+ content: var(--hw-profile-accordion-icon-content, '');
70
+ inline-size: var(--hw-profile-accordion-icon-size, 1.5rem);
71
+ block-size: var(--hw-profile-accordion-icon-size, 1.5rem);
72
+ background: var(--hw-profile-accordion-icon-background, currentColor);
73
+ mask: var(--hw-profile-accordion-icon-mask, url('./assets/icons/add-01.svg') center / contain no-repeat);
74
+ transition: transform var(--hw-duration-accordion-indicator, 0ms) var(--hw-ease-accordion, ease-in-out);
75
+ }
76
+ .hw-accordion-item[open] > .hw-accordion-trigger::after {
77
+ content: var(--hw-profile-accordion-icon-content, '');
78
+ mask: var(--hw-profile-accordion-icon-mask, url('./assets/icons/minus-sign.svg') center / contain no-repeat);
79
+ transform: var(--hw-profile-accordion-icon-expanded, none);
80
+ }
81
+ .hw-accordion-item[data-hw-expanded] > .hw-accordion-trigger::after {
82
+ content: '';
83
+ inline-size: var(--hw-profile-accordion-icon-size, 1rem);
84
+ block-size: var(--hw-profile-accordion-icon-size, 1rem);
85
+ background: currentColor;
86
+ mask: url('./assets/icons/arrow-down-01.svg') center / contain no-repeat;
87
+ transform: rotate(0deg);
88
+ }
89
+ .hw-accordion-item[data-hw-expanded='true'] > .hw-accordion-trigger::after { transform: rotate(-180deg); }
90
+ @media (prefers-reduced-motion: reduce) {
91
+ .hw-accordion-trigger, .hw-accordion-trigger::after { transition: none; }
92
+ }
93
+ @media (forced-colors: active) {
94
+ .hw-accordion, .hw-accordion-item + .hw-accordion-item { border-color: CanvasText; }
95
+ .hw-accordion-trigger:focus-visible { outline-color: Highlight; }
96
+ .hw-accordion-trigger::after { color: ButtonText; forced-color-adjust: none; }
97
+ }
@@ -0,0 +1,33 @@
1
+ /* NIC global.css 3156–3181. Explicit source sizes are additive;
2
+ existing sm/lg/xl options remain Hawiyah extensions. */
3
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
4
+ --hw-profile-avatar-size: 2.5rem;
5
+ --hw-profile-avatar-border: 3px;
6
+ }
7
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
8
+ --hw-profile-avatar-size: initial;
9
+ --hw-profile-avatar-border: initial;
10
+ }
11
+ .hw-avatar, img.hw-avatar {
12
+ inline-size: var(--hw-avatar-size, var(--hw-profile-avatar-size, 2.75rem));
13
+ block-size: var(--hw-avatar-size, var(--hw-profile-avatar-size, 2.75rem));
14
+ border-width: var(--hw-profile-avatar-border, 1px);
15
+ border-color: var(--hw-color-avatar-border);
16
+ object-fit: cover; object-position: center;
17
+ }
18
+ .hw-avatar[data-size='sm'] { --hw-avatar-size: 2rem; }
19
+ .hw-avatar[data-size='lg'] { --hw-avatar-size: 3.5rem; }
20
+ .hw-avatar[data-size='xl'], .hw-avatar[data-size='80'] { --hw-avatar-size: 5rem; }
21
+ .hw-avatar[data-size='40'] { --hw-avatar-size: 2.5rem; }
22
+ .hw-avatar[data-size='64'] { --hw-avatar-size: 4rem; }
23
+ .hw-avatar[data-size='120'] { --hw-avatar-size: 7.5rem; }
24
+ .hw-avatar[data-size='64'] { font-size: var(--hw-text-lg); }
25
+ .hw-avatar:is([data-size='80'], [data-size='120']) { font-size: var(--hw-text-2xl); }
26
+ .hw-avatar > img { display: block; min-inline-size: 0; min-block-size: 0; inline-size: 100%; block-size: 100%; object-fit: cover; object-position: center; }
27
+ .hw-avatar-group .hw-avatar {
28
+ border-width: var(--hw-profile-avatar-border, 2px);
29
+ border-color: var(--hw-dga-on, var(--hw-color-avatar-border)) var(--hw-dga-off, var(--hw-color-surface));
30
+ }
31
+ @media (forced-colors: active) {
32
+ .hw-avatar, .hw-avatar-group .hw-avatar { border-color: CanvasText; }
33
+ }
@@ -0,0 +1,56 @@
1
+ /* NIC global.css 3018–3153. See docs/nic-badges.md for measured geometry,
2
+ the source's overridden badge height and accessible multiline adaptations. */
3
+ :where(:root:not([data-hw-theme]), [data-hw-theme='dga'], [data-hw-theme='custom']) {
4
+ --hw-profile-badge-radius: .25rem;
5
+ --hw-profile-badge-padding: 0 .5rem;
6
+ --hw-profile-badge-leading: 1.125rem;
7
+ --hw-profile-badge-min-width: 2rem;
8
+ --hw-profile-badge-dot: .625rem;
9
+ --hw-profile-badge-status-gap: .5rem;
10
+ --hw-profile-badge-status-height: 1.5rem;
11
+ --hw-profile-badge-status-border: 0px;
12
+ }
13
+ :where([data-hw-theme]:not([data-hw-theme='dga'], [data-hw-theme='custom'])) {
14
+ --hw-profile-badge-radius: initial;
15
+ --hw-profile-badge-padding: initial;
16
+ --hw-profile-badge-leading: initial;
17
+ --hw-profile-badge-min-width: initial;
18
+ --hw-profile-badge-dot: initial;
19
+ --hw-profile-badge-status-gap: initial;
20
+ --hw-profile-badge-status-height: initial;
21
+ --hw-profile-badge-status-border: initial;
22
+ }
23
+ .hw-badges { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; }
24
+ .hw-badge {
25
+ --hw-tone: var(--hw-color-badge-neutral-text);
26
+ --hw-tone-bg: var(--hw-color-badge-neutral-background);
27
+ --hw-tone-border: var(--hw-color-badge-neutral-border);
28
+ --hw-badge-dot-color: var(--hw-color-badge-neutral-dot);
29
+ box-sizing: border-box; justify-content: center; flex-shrink: 0;
30
+ min-inline-size: min(100%, var(--hw-profile-badge-min-width, 0px));
31
+ padding: var(--hw-profile-badge-padding, .125rem var(--hw-space-2));
32
+ border-color: var(--hw-tone-border);
33
+ border-radius: var(--hw-profile-badge-radius, var(--hw-radius-full));
34
+ line-height: var(--hw-profile-badge-leading, 1.65);
35
+ text-align: center; white-space: normal; overflow-wrap: anywhere;
36
+ }
37
+ .hw-badge[data-tone='info'] { --hw-tone: var(--hw-color-badge-info-text); --hw-tone-bg: var(--hw-color-badge-info-background); --hw-tone-border: var(--hw-color-badge-info-border); --hw-badge-dot-color: currentColor; }
38
+ .hw-badge[data-tone='success'] { --hw-tone: var(--hw-color-badge-success-text); --hw-tone-bg: var(--hw-color-badge-success-background); --hw-tone-border: var(--hw-color-badge-success-border); --hw-badge-dot-color: currentColor; }
39
+ .hw-badge[data-tone='warning'] { --hw-tone: var(--hw-color-badge-warning-text); --hw-tone-bg: var(--hw-color-badge-warning-background); --hw-tone-border: var(--hw-color-badge-warning-border); --hw-badge-dot-color: currentColor; }
40
+ .hw-badge[data-tone='danger'] { --hw-tone: var(--hw-color-badge-danger-text); --hw-tone-bg: var(--hw-color-badge-danger-background); --hw-tone-border: var(--hw-color-badge-danger-border); --hw-badge-dot-color: currentColor; }
41
+ /* The outline variant is an existing Hawiyah extension to the source. */
42
+ .hw-badge[data-variant='outline'] { border-color: currentColor; background: transparent; }
43
+ .hw-badge[data-variant='dot'] {
44
+ min-inline-size: 0; min-block-size: var(--hw-profile-badge-status-height, 0px);
45
+ gap: var(--hw-profile-badge-status-gap, var(--hw-space-1));
46
+ border-width: var(--hw-profile-badge-status-border, 1px);
47
+ border-radius: var(--hw-radius-full);
48
+ }
49
+ .hw-badge[data-variant='dot']::before {
50
+ inline-size: var(--hw-profile-badge-dot, .375rem); block-size: var(--hw-profile-badge-dot, .375rem);
51
+ flex: none; background: var(--hw-badge-dot-color);
52
+ }
53
+ @media (forced-colors: active) {
54
+ .hw-badge, .hw-badge[data-variant='outline'] { border-color: CanvasText; color: CanvasText; background: Canvas; }
55
+ .hw-badge[data-variant='dot']::before { background: CanvasText; forced-color-adjust: none; }
56
+ }
@@ -0,0 +1,80 @@
1
+ /* NIC global.css 971–1292. Keep public density sizes; see docs/nic-buttons.md.
2
+ Color switches resolve at the component, including nested theme boundaries. */
3
+ .hw-button {
4
+ --hw-button-active: var(--hw-button-hover);
5
+ --hw-button-focus-bg: var(--hw-button-bg);
6
+ --hw-button-focus-color: var(--hw-color-focus-contrast);
7
+ --hw-button-rest-outline: none;
8
+ --hw-button-active-outline: var(--hw-button-rest-outline);
9
+ --hw-button-disabled-bg: var(--hw-color-disabled);
10
+ --hw-button-disabled-border: transparent;
11
+ --hw-button-disabled-outline: none;
12
+ }
13
+ .hw-button:not([data-variant]), .hw-button[data-variant='primary'] {
14
+ --hw-button-active: var(--hw-color-primary-active);
15
+ }
16
+ .hw-button[data-variant='default'] {
17
+ --hw-button-bg: var(--hw-color-action-default);
18
+ --hw-button-fg: var(--hw-color-on-action-default);
19
+ --hw-button-hover: var(--hw-color-action-default-hover);
20
+ --hw-button-active: var(--hw-color-action-default-active);
21
+ }
22
+ .hw-button[data-variant='secondary'] {
23
+ --hw-button-bg: var(--hw-color-action-secondary);
24
+ --hw-button-fg: var(--hw-color-on-action-secondary);
25
+ --hw-button-hover: var(--hw-color-action-secondary-hover);
26
+ --hw-button-border: var(--hw-dga-on, var(--hw-color-border-strong)) var(--hw-dga-off, transparent);
27
+ }
28
+ .hw-button[data-variant='outline'] {
29
+ --hw-button-bg: transparent;
30
+ --hw-button-fg: var(--hw-dga-on, var(--hw-color-primary-text)) var(--hw-dga-off, var(--hw-color-text));
31
+ --hw-button-border: var(--hw-dga-on, var(--hw-color-primary)) var(--hw-dga-off, transparent);
32
+ --hw-button-hover: var(--hw-color-action-outline-hover);
33
+ --hw-button-active: var(--hw-color-action-outline-active);
34
+ --hw-button-rest-outline: var(--hw-dga-on, none) var(--hw-dga-off, 1px solid var(--hw-color-action-outline-border));
35
+ --hw-button-active-outline: var(--hw-dga-on, none) var(--hw-dga-off, 1px solid var(--hw-color-action-outline-border-active));
36
+ --hw-button-disabled-bg: transparent;
37
+ --hw-button-disabled-outline: 1px solid var(--hw-color-action-outline-border);
38
+ }
39
+ .hw-button[data-variant='outline-white'] {
40
+ --hw-button-bg: transparent;
41
+ --hw-button-fg: #fff;
42
+ --hw-button-hover: rgb(255 255 255 / 0.2);
43
+ --hw-button-active: rgb(255 255 255 / 0.3);
44
+ --hw-button-focus-color: #fff;
45
+ --hw-button-rest-outline: 1px solid rgb(255 255 255 / 0.7);
46
+ --hw-button-disabled-bg: transparent;
47
+ --hw-button-disabled-outline: 1px solid var(--hw-color-action-outline-border);
48
+ }
49
+ .hw-button[data-variant='light'] {
50
+ --hw-button-bg: var(--hw-color-action-light);
51
+ --hw-button-fg: var(--hw-color-on-action-light);
52
+ --hw-button-hover: var(--hw-color-action-light-hover);
53
+ --hw-button-active: var(--hw-color-action-light-active);
54
+ }
55
+ .hw-button[data-variant='danger'] { --hw-button-active: var(--hw-color-danger-active); }
56
+ @media (hover: hover) {
57
+ .hw-button:is([data-variant='secondary'], [data-variant='light'], [data-variant='danger']):hover { --hw-button-focus-bg: var(--hw-button-hover); }
58
+ }
59
+ .hw-button { outline: var(--hw-button-rest-outline); outline-offset: 0; }
60
+ .hw-button:focus-visible:not(:disabled, [aria-disabled='true']) {
61
+ outline: var(--hw-dga-on, var(--hw-focus-width)) var(--hw-dga-off, 2px) solid var(--hw-button-focus-color);
62
+ outline-offset: var(--hw-dga-on, var(--hw-focus-offset)) var(--hw-dga-off, 0px);
63
+ background: var(--hw-dga-on, var(--hw-button-hover)) var(--hw-dga-off, var(--hw-button-focus-bg));
64
+ }
65
+ .hw-button:not(:disabled, [aria-disabled='true']):active {
66
+ background: var(--hw-button-active);
67
+ box-shadow: var(--hw-dga-on, inset 0 0 0 100px rgb(0 0 0 / 0.06)) var(--hw-dga-off, none);
68
+ }
69
+ .hw-button:active:not(:focus-visible, :disabled, [aria-disabled='true']) { outline: var(--hw-button-active-outline); }
70
+ .hw-button:is(:disabled, [aria-disabled='true']) {
71
+ background: var(--hw-button-disabled-bg);
72
+ border-color: var(--hw-button-disabled-border);
73
+ outline: var(--hw-button-disabled-outline);
74
+ }
75
+ /* Retain a visible keyboard indicator even while the key is held down. */
76
+ @media (forced-colors: active) {
77
+ .hw-button { border: 1px solid ButtonText; }
78
+ .hw-button:focus-visible:not(:disabled, [aria-disabled='true']) { outline: 2px solid Highlight; outline-offset: 2px; }
79
+ .hw-button:is(:disabled, [aria-disabled='true']) { border-color: GrayText; color: GrayText; }
80
+ }