@govnepal/css 0.2.0 → 0.3.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 (2) hide show
  1. package/dist/civic-calm.css +406 -4
  2. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * Civic Calm — @govnepal/css
3
3
  * The framework-agnostic visual layer. Semantic HTML plus .gov-* classes; no JavaScript.
4
- * Built against design-guidelines 0.2.0-dev (816565b5).
4
+ * Built against design-guidelines 0.2.0-dev (417ba0b6).
5
5
  *
6
6
  * This stylesheet holds ALL of Civic Calm's visual decisions. @govnepal/ui adds only behavior
7
7
  * (ARIA, keyboard, focus management) on top of these classes — so a plain-HTML site or a CMS
@@ -343,8 +343,21 @@ code, kbd, samp, pre,
343
343
  margin-inline-start: var(--gov-target-min-spacing);
344
344
  }
345
345
 
346
+ /* A button may be rendered as a link (<a class="gov-button">) for a primary call-to-action that
347
+ * navigates — a "start" button. The generic `a` and `a:visited` rules (link.css) would otherwise
348
+ * win: `a:visited` has higher specificity (0,1,1) than a single button class (0,1,0), so after one
349
+ * click the label would turn the link-visited colour — invisible on a filled button. Pinning the
350
+ * label colour on `:link`/`:visited` per variant restores the correct specificity, and the
351
+ * inherited underline is removed. */
352
+ .gov-button:link,
353
+ .gov-button:visited {
354
+ text-decoration: none;
355
+ }
356
+
346
357
  /* --- Variants ---------------------------------------------------------------------------- */
347
- .gov-button--primary {
358
+ .gov-button--primary,
359
+ .gov-button--primary:link,
360
+ .gov-button--primary:visited {
348
361
  background: var(--gov-color-action-primary-default);
349
362
  color: var(--gov-color-text-on-action);
350
363
  }
@@ -357,7 +370,9 @@ code, kbd, samp, pre,
357
370
  background: var(--gov-color-action-primary-active);
358
371
  }
359
372
 
360
- .gov-button--secondary {
373
+ .gov-button--secondary,
374
+ .gov-button--secondary:link,
375
+ .gov-button--secondary:visited {
361
376
  background: transparent;
362
377
  color: var(--gov-color-action-secondary-text);
363
378
  border-color: currentColor;
@@ -370,7 +385,9 @@ code, kbd, samp, pre,
370
385
  /* Always paired with a confirmation dialog (components/button.md) — the colour is a warning, not
371
386
  * the safeguard. Its red is deliberately the FUNCTIONAL red, never Simrik: "the colour of the
372
387
  * nation is never the colour of failure" (§2.1). */
373
- .gov-button--destructive {
388
+ .gov-button--destructive,
389
+ .gov-button--destructive:link,
390
+ .gov-button--destructive:visited {
374
391
  background: var(--gov-color-action-destructive-default);
375
392
  color: var(--gov-color-text-on-action);
376
393
  }
@@ -785,6 +802,80 @@ a:visited,
785
802
  color: var(--gov-color-text-placeholder);
786
803
  }
787
804
 
805
+ /* Toggle switch, textarea, character count (components/toggle.md, textarea.md, character-count.md). */
806
+
807
+ /* Toggle — on/off with immediate effect; the ON state is interactive, therefore blue (§5.2), and
808
+ * the state is shown by more than colour (position + label/word), never colour alone (§4.1). */
809
+ .gov-toggle {
810
+ display: inline-flex;
811
+ align-items: center;
812
+ gap: var(--gov-space-3);
813
+ cursor: pointer;
814
+ min-block-size: var(--gov-target-min-size);
815
+ }
816
+
817
+ .gov-toggle__track {
818
+ position: relative;
819
+ inline-size: 44px;
820
+ block-size: 24px;
821
+ flex-shrink: 0;
822
+ border-radius: var(--gov-radius-full);
823
+ background: var(--gov-color-control-track);
824
+ border: var(--gov-border-width-md) solid var(--gov-color-border-input);
825
+ transition: background-color var(--gov-motion-duration-fast) var(--gov-motion-easing-standard);
826
+ }
827
+
828
+ .gov-toggle__handle {
829
+ position: absolute;
830
+ inset-block-start: 1px;
831
+ inset-inline-start: 1px;
832
+ inline-size: 18px;
833
+ block-size: 18px;
834
+ border-radius: var(--gov-radius-full);
835
+ background: var(--gov-color-control-handle);
836
+ transition: transform var(--gov-motion-duration-fast) var(--gov-motion-easing-standard);
837
+ }
838
+
839
+ .gov-toggle[aria-checked="true"] .gov-toggle__track {
840
+ background: var(--gov-color-control-indicator);
841
+ border-color: var(--gov-color-control-indicator);
842
+ }
843
+
844
+ .gov-toggle[aria-checked="true"] .gov-toggle__handle {
845
+ transform: translateX(20px);
846
+ }
847
+
848
+ /* Textarea — multi-line free text; shares the input border/error treatment. */
849
+ .gov-textarea {
850
+ inline-size: 100%;
851
+ min-block-size: calc(var(--gov-type-body-line-height) * 3);
852
+ padding: var(--gov-space-3);
853
+ background: var(--gov-color-background-surface);
854
+ color: var(--gov-color-text-primary);
855
+ border: var(--gov-border-width-md) solid var(--gov-color-border-input);
856
+ border-radius: var(--gov-radius-sm);
857
+ resize: vertical;
858
+ font-family: var(--gov-font-family-ui);
859
+ font-size: var(--gov-type-body-font-size);
860
+ line-height: var(--gov-type-body-line-height);
861
+ }
862
+
863
+ .gov-textarea[aria-invalid="true"] {
864
+ border-color: var(--gov-color-status-error-border);
865
+ }
866
+
867
+ /* Character count — a polite remaining-characters message below a limited field. */
868
+ .gov-character-count {
869
+ color: var(--gov-color-text-secondary);
870
+ font-size: var(--gov-type-small-font-size);
871
+ line-height: var(--gov-type-small-line-height);
872
+ }
873
+
874
+ .gov-character-count--over {
875
+ color: var(--gov-color-status-error-text);
876
+ font-weight: var(--gov-font-weight-medium);
877
+ }
878
+
788
879
  /* Details (components/details.md) and warning text (components/warning-text.md).
789
880
  *
790
881
  * Details is native <details>/<summary> — the platform's own disclosure semantics, so a screen
@@ -1055,6 +1146,201 @@ a:visited,
1055
1146
  color: var(--gov-color-status-error-text);
1056
1147
  }
1057
1148
 
1149
+ /* Card (components/card.md) — group everything about one subject into one bounded, opaque surface.
1150
+ * Low shadow, per Civic Calm's restraint (§2.1); surfaces are always fully opaque (§5.2). */
1151
+ .gov-card {
1152
+ background: var(--gov-color-background-surface);
1153
+ border: var(--gov-border-width-sm) solid var(--gov-color-border-default);
1154
+ border-radius: var(--gov-radius-lg);
1155
+ padding: var(--gov-space-6);
1156
+ box-shadow: var(--gov-elevation-1);
1157
+ }
1158
+
1159
+ .gov-card > * + * {
1160
+ margin-block-start: var(--gov-space-3);
1161
+ }
1162
+
1163
+ /* The interactive variant makes the WHOLE card one link/target — never nest independent links
1164
+ * inside it (a nested-interactive failure). */
1165
+ .gov-card--interactive {
1166
+ display: block;
1167
+ color: inherit;
1168
+ text-decoration: none;
1169
+ cursor: pointer;
1170
+ }
1171
+
1172
+ .gov-card--interactive:hover {
1173
+ border-color: var(--gov-color-border-strong);
1174
+ }
1175
+
1176
+ /* Icon button (components/icon-button.md) — an icon-only action with a required accessible name.
1177
+ * 44x44 minimum hit area even though the icon is smaller; never a primary action (§5.4). */
1178
+ .gov-icon-button {
1179
+ display: inline-flex;
1180
+ align-items: center;
1181
+ justify-content: center;
1182
+ min-inline-size: var(--gov-target-min-size);
1183
+ min-block-size: var(--gov-target-min-size);
1184
+ padding: var(--gov-space-2);
1185
+ border: 0;
1186
+ border-radius: var(--gov-radius-sm);
1187
+ background: transparent;
1188
+ color: var(--gov-color-text-primary);
1189
+ cursor: pointer;
1190
+ }
1191
+
1192
+ .gov-icon-button:hover {
1193
+ background: var(--gov-color-interactive-hover-surface);
1194
+ }
1195
+
1196
+ .gov-icon-button:active {
1197
+ background: var(--gov-color-interactive-pressed-surface);
1198
+ }
1199
+
1200
+ .gov-icon-button[disabled],
1201
+ .gov-icon-button[aria-disabled="true"] {
1202
+ color: var(--gov-color-text-disabled);
1203
+ cursor: not-allowed;
1204
+ }
1205
+
1206
+ .gov-icon-button__icon {
1207
+ inline-size: var(--gov-icon-size-md);
1208
+ block-size: var(--gov-icon-size-md);
1209
+ }
1210
+
1211
+ [data-density="kiosk-counter"] .gov-icon-button {
1212
+ min-inline-size: var(--gov-target-recommended-size);
1213
+ min-block-size: var(--gov-target-recommended-size);
1214
+ }
1215
+
1216
+ /* Modal, confirmation dialog, and toast (components/modal.md, confirmation-dialog.md, toast.md).
1217
+ * Overlays sit above content; surfaces stay fully opaque even over the scrim (§5.2). */
1218
+
1219
+ .gov-modal__scrim {
1220
+ position: fixed;
1221
+ inset: 0;
1222
+ z-index: var(--gov-z-overlay);
1223
+ background: var(--gov-color-overlay-scrim);
1224
+ display: flex;
1225
+ align-items: center;
1226
+ justify-content: center;
1227
+ padding: var(--gov-space-4);
1228
+ }
1229
+
1230
+ .gov-modal {
1231
+ position: relative;
1232
+ z-index: var(--gov-z-modal);
1233
+ inline-size: 100%;
1234
+ max-inline-size: 32rem;
1235
+ max-block-size: calc(100vh - var(--gov-space-8));
1236
+ overflow: auto;
1237
+ background: var(--gov-color-background-surface);
1238
+ border-radius: var(--gov-radius-lg);
1239
+ padding: var(--gov-space-6);
1240
+ box-shadow: var(--gov-elevation-3);
1241
+ }
1242
+
1243
+ .gov-modal__title {
1244
+ font-size: var(--gov-type-h3-font-size);
1245
+ line-height: var(--gov-type-h3-line-height);
1246
+ font-weight: var(--gov-font-weight-semibold);
1247
+ margin-block-end: var(--gov-space-3);
1248
+ }
1249
+
1250
+ .gov-modal__actions {
1251
+ display: flex;
1252
+ flex-wrap: wrap;
1253
+ gap: var(--gov-space-3);
1254
+ margin-block-start: var(--gov-space-6);
1255
+ }
1256
+
1257
+ /* Toast — a small floating confirmation that auto-dismisses. Success/info only, never errors. */
1258
+ .gov-toast-region {
1259
+ position: fixed;
1260
+ inset-block-end: var(--gov-space-6);
1261
+ inset-inline: 0;
1262
+ z-index: var(--gov-z-toast);
1263
+ display: flex;
1264
+ flex-direction: column;
1265
+ align-items: center;
1266
+ gap: var(--gov-space-2);
1267
+ pointer-events: none;
1268
+ }
1269
+
1270
+ .gov-toast {
1271
+ display: inline-flex;
1272
+ align-items: center;
1273
+ gap: var(--gov-space-2);
1274
+ padding: var(--gov-space-3) var(--gov-space-4);
1275
+ border-radius: var(--gov-radius-md);
1276
+ box-shadow: var(--gov-elevation-2);
1277
+ pointer-events: auto;
1278
+ }
1279
+
1280
+ .gov-toast--success {
1281
+ background: var(--gov-color-status-success-background);
1282
+ color: var(--gov-color-status-success-text);
1283
+ border: var(--gov-border-width-sm) solid var(--gov-color-status-success-border);
1284
+ }
1285
+
1286
+ .gov-toast--info {
1287
+ background: var(--gov-color-status-info-background);
1288
+ color: var(--gov-color-status-info-text);
1289
+ border: var(--gov-border-width-sm) solid var(--gov-color-status-info-border);
1290
+ }
1291
+
1292
+ /* Tag and summary list (components/tag.md, summary-list.md). */
1293
+
1294
+ /* Tag — a neutral categorical label, NEVER a status colour (that belongs to badge). */
1295
+ .gov-tag {
1296
+ display: inline-flex;
1297
+ align-items: center;
1298
+ gap: var(--gov-space-1);
1299
+ padding-inline: var(--gov-space-2);
1300
+ padding-block: var(--gov-space-1);
1301
+ border-radius: var(--gov-radius-full);
1302
+ background: var(--gov-color-background-secondary);
1303
+ color: var(--gov-color-text-secondary);
1304
+ border: var(--gov-border-width-sm) solid var(--gov-color-border-default);
1305
+ font-size: var(--gov-type-small-font-size);
1306
+ font-weight: var(--gov-font-weight-medium);
1307
+ white-space: nowrap;
1308
+ }
1309
+
1310
+ /* Summary list — review-your-answers rows (key / value / change). */
1311
+ .gov-summary-list {
1312
+ margin: 0;
1313
+ }
1314
+
1315
+ .gov-summary-list__row {
1316
+ display: grid;
1317
+ gap: var(--gov-space-2) var(--gov-space-4);
1318
+ grid-template-columns: 1fr;
1319
+ padding-block: var(--gov-space-3);
1320
+ border-block-end: var(--gov-border-width-sm) solid var(--gov-color-border-default);
1321
+ break-inside: avoid;
1322
+ }
1323
+
1324
+ @media (min-width: 640px) {
1325
+ .gov-summary-list__row {
1326
+ grid-template-columns: 1fr 2fr auto;
1327
+ align-items: baseline;
1328
+ }
1329
+ }
1330
+
1331
+ .gov-summary-list__key {
1332
+ font-weight: var(--gov-font-weight-medium);
1333
+ margin: 0;
1334
+ }
1335
+
1336
+ .gov-summary-list__value {
1337
+ margin: 0;
1338
+ }
1339
+
1340
+ .gov-summary-list__action {
1341
+ justify-self: start;
1342
+ }
1343
+
1058
1344
  /* Phase banner (components/phase-banner.md), stepper (components/stepper.md), and language
1059
1345
  * switcher (components/language-switcher.md) — the standalone navigation pieces. */
1060
1346
 
@@ -1169,6 +1455,122 @@ a:visited,
1169
1455
  color: var(--gov-color-text-secondary);
1170
1456
  }
1171
1457
 
1458
+ /* Breadcrumb, tabs, pagination, footer (components/breadcrumb.md, tabs.md, pagination.md, footer.md). */
1459
+
1460
+ /* Breadcrumb — hierarchy links, current page as plain text. */
1461
+ .gov-breadcrumb {
1462
+ display: flex;
1463
+ flex-wrap: wrap;
1464
+ align-items: center;
1465
+ gap: var(--gov-space-2);
1466
+ list-style: none;
1467
+ padding: 0;
1468
+ color: var(--gov-color-text-secondary);
1469
+ font-size: var(--gov-type-small-font-size);
1470
+ }
1471
+
1472
+ .gov-breadcrumb__sep {
1473
+ color: var(--gov-color-text-secondary);
1474
+ }
1475
+
1476
+ .gov-breadcrumb [aria-current="page"] {
1477
+ color: var(--gov-color-text-primary);
1478
+ font-weight: var(--gov-font-weight-medium);
1479
+ }
1480
+
1481
+ /* Tabs — the selected tab marked by weight + underline, never colour alone. */
1482
+ .gov-tabs__list {
1483
+ display: flex;
1484
+ flex-wrap: wrap;
1485
+ gap: var(--gov-space-2);
1486
+ border-block-end: var(--gov-border-width-sm) solid var(--gov-color-border-default);
1487
+ }
1488
+
1489
+ .gov-tabs__tab {
1490
+ min-block-size: var(--gov-target-min-size);
1491
+ padding: var(--gov-space-3) var(--gov-space-4);
1492
+ border: 0;
1493
+ background: transparent;
1494
+ color: var(--gov-color-text-secondary);
1495
+ cursor: pointer;
1496
+ border-block-end: var(--gov-border-width-md) solid transparent;
1497
+ margin-block-end: calc(-1 * var(--gov-border-width-sm));
1498
+ }
1499
+
1500
+ .gov-tabs__tab[aria-selected="true"] {
1501
+ color: var(--gov-color-text-primary);
1502
+ font-weight: var(--gov-font-weight-semibold);
1503
+ border-block-end-color: var(--gov-color-interactive-selected-indicator);
1504
+ }
1505
+
1506
+ .gov-tabs__panel {
1507
+ padding-block-start: var(--gov-space-4);
1508
+ }
1509
+
1510
+ /* Pagination — numbered links, current marked by more than colour. */
1511
+ .gov-pagination {
1512
+ display: flex;
1513
+ flex-wrap: wrap;
1514
+ align-items: center;
1515
+ gap: var(--gov-space-2);
1516
+ list-style: none;
1517
+ padding: 0;
1518
+ }
1519
+
1520
+ .gov-pagination__link {
1521
+ display: inline-flex;
1522
+ align-items: center;
1523
+ justify-content: center;
1524
+ min-inline-size: var(--gov-target-min-size);
1525
+ min-block-size: var(--gov-target-min-size);
1526
+ padding-inline: var(--gov-space-2);
1527
+ border-radius: var(--gov-radius-sm);
1528
+ text-decoration: none;
1529
+ color: var(--gov-color-link-default);
1530
+ }
1531
+
1532
+ .gov-pagination__link[aria-current="page"] {
1533
+ background: var(--gov-color-interactive-selected-background);
1534
+ color: var(--gov-color-text-primary);
1535
+ font-weight: var(--gov-font-weight-semibold);
1536
+ }
1537
+
1538
+ .gov-pagination__link[aria-disabled="true"] {
1539
+ color: var(--gov-color-text-disabled);
1540
+ pointer-events: none;
1541
+ }
1542
+
1543
+ /* Footer — a two-column trust band, single column on mobile. */
1544
+ .gov-footer {
1545
+ background: var(--gov-color-background-secondary);
1546
+ border-block-start: var(--gov-border-width-sm) solid var(--gov-color-border-default);
1547
+ padding-block: var(--gov-space-8);
1548
+ }
1549
+
1550
+ .gov-footer__grid {
1551
+ display: grid;
1552
+ gap: var(--gov-space-8);
1553
+ grid-template-columns: 1fr;
1554
+ }
1555
+
1556
+ @media (min-width: 768px) {
1557
+ .gov-footer__grid {
1558
+ grid-template-columns: 2fr 1fr;
1559
+ }
1560
+ }
1561
+
1562
+ .gov-footer__links {
1563
+ list-style: none;
1564
+ padding: 0;
1565
+ display: flex;
1566
+ flex-direction: column;
1567
+ gap: var(--gov-space-2);
1568
+ }
1569
+
1570
+ .gov-footer__office-en {
1571
+ color: var(--gov-color-text-secondary);
1572
+ }
1573
+
1172
1574
  /* National identity marks — the emblem and flag (identity/emblem, identity/flag).
1173
1575
  *
1174
1576
  * Base sizing only. Both are <img> of verified masters; neither is boxed, recoloured, or given a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@govnepal/css",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Civic Calm — the framework-agnostic stylesheet. Semantic HTML plus .gov-* classes, no JavaScript.",
5
5
  "license": "MIT",
6
6
  "type": "module",