An ATproto social media client -- with an independent Appview.

Revert "Migrate to `@bsky.app/alf` package (#9030)"

This reverts commit bd17f0481054f23aa2e0bb5aecf88566fdfe9d6a.

serenity e33d3c1b aad8b02f

+2061 -477
-1
package.json
··· 74 74 "@atproto/api": "^0.16.7", 75 75 "@bitdrift/react-native": "^0.6.8", 76 76 "@braintree/sanitize-url": "^6.0.2", 77 - "@bsky.app/alf": "^0.1.2", 78 77 "@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet", 79 78 "@emoji-mart/react": "^1.1.1", 80 79 "@expo/html-elements": "^0.12.5",
+997 -4
src/alf/atoms.ts
··· 1 - import {type StyleProp, type ViewStyle} from 'react-native' 2 - import {atoms as baseAtoms} from '@bsky.app/alf' 1 + import { 2 + Platform, 3 + type StyleProp, 4 + StyleSheet, 5 + type ViewStyle, 6 + } from 'react-native' 3 7 4 - import {native, platform, web} from '#/alf/util/platform' 8 + import * as tokens from '#/alf/tokens' 9 + import {ios, native, platform, web} from '#/alf/util/platform' 5 10 import * as Layout from '#/components/Layout' 6 11 7 12 export const atoms = { 8 - ...baseAtoms, 13 + debug: { 14 + borderColor: 'red', 15 + borderWidth: 1, 16 + }, 9 17 18 + /* 19 + * Positioning 20 + */ 21 + fixed: { 22 + position: Platform.select({web: 'fixed', native: 'absolute'}) as 'absolute', 23 + }, 24 + absolute: { 25 + position: 'absolute', 26 + }, 27 + relative: { 28 + position: 'relative', 29 + }, 30 + static: { 31 + position: 'static', 32 + }, 33 + sticky: web({ 34 + position: 'sticky', 35 + }), 36 + inset_0: { 37 + top: 0, 38 + left: 0, 39 + right: 0, 40 + bottom: 0, 41 + }, 42 + top_0: { 43 + top: 0, 44 + }, 45 + right_0: { 46 + right: 0, 47 + }, 48 + bottom_0: { 49 + bottom: 0, 50 + }, 51 + left_0: { 52 + left: 0, 53 + }, 54 + z_10: { 55 + zIndex: 10, 56 + }, 57 + z_20: { 58 + zIndex: 20, 59 + }, 60 + z_30: { 61 + zIndex: 30, 62 + }, 63 + z_40: { 64 + zIndex: 40, 65 + }, 66 + z_50: { 67 + zIndex: 50, 68 + }, 69 + 70 + overflow_visible: { 71 + overflow: 'visible', 72 + }, 73 + overflow_x_visible: { 74 + overflowX: 'visible', 75 + }, 76 + overflow_y_visible: { 77 + overflowY: 'visible', 78 + }, 79 + overflow_hidden: { 80 + overflow: 'hidden', 81 + }, 82 + overflow_x_hidden: { 83 + overflowX: 'hidden', 84 + }, 85 + overflow_y_hidden: { 86 + overflowY: 'hidden', 87 + }, 88 + /** 89 + * @platform web 90 + */ 91 + overflow_auto: web({ 92 + overflow: 'auto', 93 + }), 94 + 95 + /* 96 + * Width & Height 97 + */ 98 + w_full: { 99 + width: '100%', 100 + }, 101 + h_full: { 102 + height: '100%', 103 + }, 10 104 h_full_vh: web({ 11 105 height: '100vh', 12 106 }), 107 + max_w_full: { 108 + maxWidth: '100%', 109 + }, 110 + max_h_full: { 111 + maxHeight: '100%', 112 + }, 13 113 14 114 /** 15 115 * Used for the outermost components on screens, to ensure that they can fill ··· 32 132 }, 33 133 34 134 /* 135 + * Border radius 136 + */ 137 + rounded_0: { 138 + borderRadius: 0, 139 + }, 140 + rounded_2xs: { 141 + borderRadius: tokens.borderRadius._2xs, 142 + }, 143 + rounded_xs: { 144 + borderRadius: tokens.borderRadius.xs, 145 + }, 146 + rounded_sm: { 147 + borderRadius: tokens.borderRadius.sm, 148 + }, 149 + rounded_md: { 150 + borderRadius: tokens.borderRadius.md, 151 + }, 152 + rounded_lg: { 153 + borderRadius: tokens.borderRadius.lg, 154 + }, 155 + rounded_full: { 156 + borderRadius: tokens.borderRadius.full, 157 + }, 158 + 159 + /* 160 + * Flex 161 + */ 162 + gap_0: { 163 + gap: 0, 164 + }, 165 + gap_2xs: { 166 + gap: tokens.space._2xs, 167 + }, 168 + gap_xs: { 169 + gap: tokens.space.xs, 170 + }, 171 + gap_sm: { 172 + gap: tokens.space.sm, 173 + }, 174 + gap_md: { 175 + gap: tokens.space.md, 176 + }, 177 + gap_lg: { 178 + gap: tokens.space.lg, 179 + }, 180 + gap_xl: { 181 + gap: tokens.space.xl, 182 + }, 183 + gap_2xl: { 184 + gap: tokens.space._2xl, 185 + }, 186 + gap_3xl: { 187 + gap: tokens.space._3xl, 188 + }, 189 + gap_4xl: { 190 + gap: tokens.space._4xl, 191 + }, 192 + gap_5xl: { 193 + gap: tokens.space._5xl, 194 + }, 195 + flex: { 196 + display: 'flex', 197 + }, 198 + flex_col: { 199 + flexDirection: 'column', 200 + }, 201 + flex_row: { 202 + flexDirection: 'row', 203 + }, 204 + flex_col_reverse: { 205 + flexDirection: 'column-reverse', 206 + }, 207 + flex_row_reverse: { 208 + flexDirection: 'row-reverse', 209 + }, 210 + flex_wrap: { 211 + flexWrap: 'wrap', 212 + }, 213 + flex_nowrap: { 214 + flexWrap: 'nowrap', 215 + }, 216 + flex_0: { 217 + flex: web('0 0 auto') || (native(0) as number), 218 + }, 219 + flex_1: { 220 + flex: 1, 221 + }, 222 + flex_grow: { 223 + flexGrow: 1, 224 + }, 225 + flex_grow_0: { 226 + flexGrow: 0, 227 + }, 228 + flex_shrink: { 229 + flexShrink: 1, 230 + }, 231 + flex_shrink_0: { 232 + flexShrink: 0, 233 + }, 234 + justify_start: { 235 + justifyContent: 'flex-start', 236 + }, 237 + justify_center: { 238 + justifyContent: 'center', 239 + }, 240 + justify_between: { 241 + justifyContent: 'space-between', 242 + }, 243 + justify_end: { 244 + justifyContent: 'flex-end', 245 + }, 246 + align_center: { 247 + alignItems: 'center', 248 + }, 249 + align_start: { 250 + alignItems: 'flex-start', 251 + }, 252 + align_end: { 253 + alignItems: 'flex-end', 254 + }, 255 + align_baseline: { 256 + alignItems: 'baseline', 257 + }, 258 + align_stretch: { 259 + alignItems: 'stretch', 260 + }, 261 + self_auto: { 262 + alignSelf: 'auto', 263 + }, 264 + self_start: { 265 + alignSelf: 'flex-start', 266 + }, 267 + self_end: { 268 + alignSelf: 'flex-end', 269 + }, 270 + self_center: { 271 + alignSelf: 'center', 272 + }, 273 + self_stretch: { 274 + alignSelf: 'stretch', 275 + }, 276 + self_baseline: { 277 + alignSelf: 'baseline', 278 + }, 279 + 280 + /* 281 + * Text 282 + */ 283 + text_left: { 284 + textAlign: 'left', 285 + }, 286 + text_center: { 287 + textAlign: 'center', 288 + }, 289 + text_right: { 290 + textAlign: 'right', 291 + }, 292 + text_2xs: { 293 + fontSize: tokens.fontSize._2xs, 294 + letterSpacing: tokens.TRACKING, 295 + }, 296 + text_xs: { 297 + fontSize: tokens.fontSize.xs, 298 + letterSpacing: tokens.TRACKING, 299 + }, 300 + text_sm: { 301 + fontSize: tokens.fontSize.sm, 302 + letterSpacing: tokens.TRACKING, 303 + }, 304 + text_md: { 305 + fontSize: tokens.fontSize.md, 306 + letterSpacing: tokens.TRACKING, 307 + }, 308 + text_lg: { 309 + fontSize: tokens.fontSize.lg, 310 + letterSpacing: tokens.TRACKING, 311 + }, 312 + text_xl: { 313 + fontSize: tokens.fontSize.xl, 314 + letterSpacing: tokens.TRACKING, 315 + }, 316 + text_2xl: { 317 + fontSize: tokens.fontSize._2xl, 318 + letterSpacing: tokens.TRACKING, 319 + }, 320 + text_3xl: { 321 + fontSize: tokens.fontSize._3xl, 322 + letterSpacing: tokens.TRACKING, 323 + }, 324 + text_4xl: { 325 + fontSize: tokens.fontSize._4xl, 326 + letterSpacing: tokens.TRACKING, 327 + }, 328 + text_5xl: { 329 + fontSize: tokens.fontSize._5xl, 330 + letterSpacing: tokens.TRACKING, 331 + }, 332 + leading_tight: { 333 + lineHeight: 1.15, 334 + }, 335 + leading_snug: { 336 + lineHeight: 1.3, 337 + }, 338 + leading_normal: { 339 + lineHeight: 1.5, 340 + }, 341 + tracking_normal: { 342 + letterSpacing: tokens.TRACKING, 343 + }, 344 + font_normal: { 345 + fontWeight: tokens.fontWeight.normal, 346 + }, 347 + font_medium: { 348 + fontWeight: tokens.fontWeight.medium, 349 + }, 350 + font_bold: { 351 + fontWeight: tokens.fontWeight.bold, 352 + }, 353 + font_heavy: { 354 + fontWeight: tokens.fontWeight.heavy, 355 + }, 356 + italic: { 357 + fontStyle: 'italic', 358 + }, 359 + 360 + /* 361 + * Border 362 + */ 363 + border_0: { 364 + borderWidth: 0, 365 + }, 366 + border_t_0: { 367 + borderTopWidth: 0, 368 + }, 369 + border_b_0: { 370 + borderBottomWidth: 0, 371 + }, 372 + border_l_0: { 373 + borderLeftWidth: 0, 374 + }, 375 + border_r_0: { 376 + borderRightWidth: 0, 377 + }, 378 + border_x_0: { 379 + borderLeftWidth: 0, 380 + borderRightWidth: 0, 381 + }, 382 + border_y_0: { 383 + borderTopWidth: 0, 384 + borderBottomWidth: 0, 385 + }, 386 + border: { 387 + borderWidth: StyleSheet.hairlineWidth, 388 + }, 389 + border_t: { 390 + borderTopWidth: StyleSheet.hairlineWidth, 391 + }, 392 + border_b: { 393 + borderBottomWidth: StyleSheet.hairlineWidth, 394 + }, 395 + border_l: { 396 + borderLeftWidth: StyleSheet.hairlineWidth, 397 + }, 398 + border_r: { 399 + borderRightWidth: StyleSheet.hairlineWidth, 400 + }, 401 + border_x: { 402 + borderLeftWidth: StyleSheet.hairlineWidth, 403 + borderRightWidth: StyleSheet.hairlineWidth, 404 + }, 405 + border_y: { 406 + borderTopWidth: StyleSheet.hairlineWidth, 407 + borderBottomWidth: StyleSheet.hairlineWidth, 408 + }, 409 + border_transparent: { 410 + borderColor: 'transparent', 411 + }, 412 + curve_circular: ios({ 413 + borderCurve: 'circular', 414 + }), 415 + curve_continuous: ios({ 416 + borderCurve: 'continuous', 417 + }), 418 + 419 + /* 420 + * Shadow 421 + */ 422 + shadow_sm: { 423 + shadowRadius: 8, 424 + shadowOpacity: 0.1, 425 + elevation: 8, 426 + }, 427 + shadow_md: { 428 + shadowRadius: 16, 429 + shadowOpacity: 0.1, 430 + elevation: 16, 431 + }, 432 + shadow_lg: { 433 + shadowRadius: 32, 434 + shadowOpacity: 0.1, 435 + elevation: 24, 436 + }, 437 + 438 + /* 439 + * Padding 440 + */ 441 + p_0: { 442 + padding: 0, 443 + }, 444 + p_2xs: { 445 + padding: tokens.space._2xs, 446 + }, 447 + p_xs: { 448 + padding: tokens.space.xs, 449 + }, 450 + p_sm: { 451 + padding: tokens.space.sm, 452 + }, 453 + p_md: { 454 + padding: tokens.space.md, 455 + }, 456 + p_lg: { 457 + padding: tokens.space.lg, 458 + }, 459 + p_xl: { 460 + padding: tokens.space.xl, 461 + }, 462 + p_2xl: { 463 + padding: tokens.space._2xl, 464 + }, 465 + p_3xl: { 466 + padding: tokens.space._3xl, 467 + }, 468 + p_4xl: { 469 + padding: tokens.space._4xl, 470 + }, 471 + p_5xl: { 472 + padding: tokens.space._5xl, 473 + }, 474 + px_0: { 475 + paddingLeft: 0, 476 + paddingRight: 0, 477 + }, 478 + px_2xs: { 479 + paddingLeft: tokens.space._2xs, 480 + paddingRight: tokens.space._2xs, 481 + }, 482 + px_xs: { 483 + paddingLeft: tokens.space.xs, 484 + paddingRight: tokens.space.xs, 485 + }, 486 + px_sm: { 487 + paddingLeft: tokens.space.sm, 488 + paddingRight: tokens.space.sm, 489 + }, 490 + px_md: { 491 + paddingLeft: tokens.space.md, 492 + paddingRight: tokens.space.md, 493 + }, 494 + px_lg: { 495 + paddingLeft: tokens.space.lg, 496 + paddingRight: tokens.space.lg, 497 + }, 498 + px_xl: { 499 + paddingLeft: tokens.space.xl, 500 + paddingRight: tokens.space.xl, 501 + }, 502 + px_2xl: { 503 + paddingLeft: tokens.space._2xl, 504 + paddingRight: tokens.space._2xl, 505 + }, 506 + px_3xl: { 507 + paddingLeft: tokens.space._3xl, 508 + paddingRight: tokens.space._3xl, 509 + }, 510 + px_4xl: { 511 + paddingLeft: tokens.space._4xl, 512 + paddingRight: tokens.space._4xl, 513 + }, 514 + px_5xl: { 515 + paddingLeft: tokens.space._5xl, 516 + paddingRight: tokens.space._5xl, 517 + }, 518 + py_0: { 519 + paddingTop: 0, 520 + paddingBottom: 0, 521 + }, 522 + py_2xs: { 523 + paddingTop: tokens.space._2xs, 524 + paddingBottom: tokens.space._2xs, 525 + }, 526 + py_xs: { 527 + paddingTop: tokens.space.xs, 528 + paddingBottom: tokens.space.xs, 529 + }, 530 + py_sm: { 531 + paddingTop: tokens.space.sm, 532 + paddingBottom: tokens.space.sm, 533 + }, 534 + py_md: { 535 + paddingTop: tokens.space.md, 536 + paddingBottom: tokens.space.md, 537 + }, 538 + py_lg: { 539 + paddingTop: tokens.space.lg, 540 + paddingBottom: tokens.space.lg, 541 + }, 542 + py_xl: { 543 + paddingTop: tokens.space.xl, 544 + paddingBottom: tokens.space.xl, 545 + }, 546 + py_2xl: { 547 + paddingTop: tokens.space._2xl, 548 + paddingBottom: tokens.space._2xl, 549 + }, 550 + py_3xl: { 551 + paddingTop: tokens.space._3xl, 552 + paddingBottom: tokens.space._3xl, 553 + }, 554 + py_4xl: { 555 + paddingTop: tokens.space._4xl, 556 + paddingBottom: tokens.space._4xl, 557 + }, 558 + py_5xl: { 559 + paddingTop: tokens.space._5xl, 560 + paddingBottom: tokens.space._5xl, 561 + }, 562 + pt_0: { 563 + paddingTop: 0, 564 + }, 565 + pt_2xs: { 566 + paddingTop: tokens.space._2xs, 567 + }, 568 + pt_xs: { 569 + paddingTop: tokens.space.xs, 570 + }, 571 + pt_sm: { 572 + paddingTop: tokens.space.sm, 573 + }, 574 + pt_md: { 575 + paddingTop: tokens.space.md, 576 + }, 577 + pt_lg: { 578 + paddingTop: tokens.space.lg, 579 + }, 580 + pt_xl: { 581 + paddingTop: tokens.space.xl, 582 + }, 583 + pt_2xl: { 584 + paddingTop: tokens.space._2xl, 585 + }, 586 + pt_3xl: { 587 + paddingTop: tokens.space._3xl, 588 + }, 589 + pt_4xl: { 590 + paddingTop: tokens.space._4xl, 591 + }, 592 + pt_5xl: { 593 + paddingTop: tokens.space._5xl, 594 + }, 595 + pb_0: { 596 + paddingBottom: 0, 597 + }, 598 + pb_2xs: { 599 + paddingBottom: tokens.space._2xs, 600 + }, 601 + pb_xs: { 602 + paddingBottom: tokens.space.xs, 603 + }, 604 + pb_sm: { 605 + paddingBottom: tokens.space.sm, 606 + }, 607 + pb_md: { 608 + paddingBottom: tokens.space.md, 609 + }, 610 + pb_lg: { 611 + paddingBottom: tokens.space.lg, 612 + }, 613 + pb_xl: { 614 + paddingBottom: tokens.space.xl, 615 + }, 616 + pb_2xl: { 617 + paddingBottom: tokens.space._2xl, 618 + }, 619 + pb_3xl: { 620 + paddingBottom: tokens.space._3xl, 621 + }, 622 + pb_4xl: { 623 + paddingBottom: tokens.space._4xl, 624 + }, 625 + pb_5xl: { 626 + paddingBottom: tokens.space._5xl, 627 + }, 628 + pl_0: { 629 + paddingLeft: 0, 630 + }, 631 + pl_2xs: { 632 + paddingLeft: tokens.space._2xs, 633 + }, 634 + pl_xs: { 635 + paddingLeft: tokens.space.xs, 636 + }, 637 + pl_sm: { 638 + paddingLeft: tokens.space.sm, 639 + }, 640 + pl_md: { 641 + paddingLeft: tokens.space.md, 642 + }, 643 + pl_lg: { 644 + paddingLeft: tokens.space.lg, 645 + }, 646 + pl_xl: { 647 + paddingLeft: tokens.space.xl, 648 + }, 649 + pl_2xl: { 650 + paddingLeft: tokens.space._2xl, 651 + }, 652 + pl_3xl: { 653 + paddingLeft: tokens.space._3xl, 654 + }, 655 + pl_4xl: { 656 + paddingLeft: tokens.space._4xl, 657 + }, 658 + pl_5xl: { 659 + paddingLeft: tokens.space._5xl, 660 + }, 661 + pr_0: { 662 + paddingRight: 0, 663 + }, 664 + pr_2xs: { 665 + paddingRight: tokens.space._2xs, 666 + }, 667 + pr_xs: { 668 + paddingRight: tokens.space.xs, 669 + }, 670 + pr_sm: { 671 + paddingRight: tokens.space.sm, 672 + }, 673 + pr_md: { 674 + paddingRight: tokens.space.md, 675 + }, 676 + pr_lg: { 677 + paddingRight: tokens.space.lg, 678 + }, 679 + pr_xl: { 680 + paddingRight: tokens.space.xl, 681 + }, 682 + pr_2xl: { 683 + paddingRight: tokens.space._2xl, 684 + }, 685 + pr_3xl: { 686 + paddingRight: tokens.space._3xl, 687 + }, 688 + pr_4xl: { 689 + paddingRight: tokens.space._4xl, 690 + }, 691 + pr_5xl: { 692 + paddingRight: tokens.space._5xl, 693 + }, 694 + 695 + /* 696 + * Margin 697 + */ 698 + m_0: { 699 + margin: 0, 700 + }, 701 + m_2xs: { 702 + margin: tokens.space._2xs, 703 + }, 704 + m_xs: { 705 + margin: tokens.space.xs, 706 + }, 707 + m_sm: { 708 + margin: tokens.space.sm, 709 + }, 710 + m_md: { 711 + margin: tokens.space.md, 712 + }, 713 + m_lg: { 714 + margin: tokens.space.lg, 715 + }, 716 + m_xl: { 717 + margin: tokens.space.xl, 718 + }, 719 + m_2xl: { 720 + margin: tokens.space._2xl, 721 + }, 722 + m_3xl: { 723 + margin: tokens.space._3xl, 724 + }, 725 + m_4xl: { 726 + margin: tokens.space._4xl, 727 + }, 728 + m_5xl: { 729 + margin: tokens.space._5xl, 730 + }, 731 + m_auto: { 732 + margin: 'auto', 733 + }, 734 + mx_0: { 735 + marginLeft: 0, 736 + marginRight: 0, 737 + }, 738 + mx_2xs: { 739 + marginLeft: tokens.space._2xs, 740 + marginRight: tokens.space._2xs, 741 + }, 742 + mx_xs: { 743 + marginLeft: tokens.space.xs, 744 + marginRight: tokens.space.xs, 745 + }, 746 + mx_sm: { 747 + marginLeft: tokens.space.sm, 748 + marginRight: tokens.space.sm, 749 + }, 750 + mx_md: { 751 + marginLeft: tokens.space.md, 752 + marginRight: tokens.space.md, 753 + }, 754 + mx_lg: { 755 + marginLeft: tokens.space.lg, 756 + marginRight: tokens.space.lg, 757 + }, 758 + mx_xl: { 759 + marginLeft: tokens.space.xl, 760 + marginRight: tokens.space.xl, 761 + }, 762 + mx_2xl: { 763 + marginLeft: tokens.space._2xl, 764 + marginRight: tokens.space._2xl, 765 + }, 766 + mx_3xl: { 767 + marginLeft: tokens.space._3xl, 768 + marginRight: tokens.space._3xl, 769 + }, 770 + mx_4xl: { 771 + marginLeft: tokens.space._4xl, 772 + marginRight: tokens.space._4xl, 773 + }, 774 + mx_5xl: { 775 + marginLeft: tokens.space._5xl, 776 + marginRight: tokens.space._5xl, 777 + }, 778 + mx_auto: { 779 + marginLeft: 'auto', 780 + marginRight: 'auto', 781 + }, 782 + my_0: { 783 + marginTop: 0, 784 + marginBottom: 0, 785 + }, 786 + my_2xs: { 787 + marginTop: tokens.space._2xs, 788 + marginBottom: tokens.space._2xs, 789 + }, 790 + my_xs: { 791 + marginTop: tokens.space.xs, 792 + marginBottom: tokens.space.xs, 793 + }, 794 + my_sm: { 795 + marginTop: tokens.space.sm, 796 + marginBottom: tokens.space.sm, 797 + }, 798 + my_md: { 799 + marginTop: tokens.space.md, 800 + marginBottom: tokens.space.md, 801 + }, 802 + my_lg: { 803 + marginTop: tokens.space.lg, 804 + marginBottom: tokens.space.lg, 805 + }, 806 + my_xl: { 807 + marginTop: tokens.space.xl, 808 + marginBottom: tokens.space.xl, 809 + }, 810 + my_2xl: { 811 + marginTop: tokens.space._2xl, 812 + marginBottom: tokens.space._2xl, 813 + }, 814 + my_3xl: { 815 + marginTop: tokens.space._3xl, 816 + marginBottom: tokens.space._3xl, 817 + }, 818 + my_4xl: { 819 + marginTop: tokens.space._4xl, 820 + marginBottom: tokens.space._4xl, 821 + }, 822 + my_5xl: { 823 + marginTop: tokens.space._5xl, 824 + marginBottom: tokens.space._5xl, 825 + }, 826 + my_auto: { 827 + marginTop: 'auto', 828 + marginBottom: 'auto', 829 + }, 830 + mt_0: { 831 + marginTop: 0, 832 + }, 833 + mt_2xs: { 834 + marginTop: tokens.space._2xs, 835 + }, 836 + mt_xs: { 837 + marginTop: tokens.space.xs, 838 + }, 839 + mt_sm: { 840 + marginTop: tokens.space.sm, 841 + }, 842 + mt_md: { 843 + marginTop: tokens.space.md, 844 + }, 845 + mt_lg: { 846 + marginTop: tokens.space.lg, 847 + }, 848 + mt_xl: { 849 + marginTop: tokens.space.xl, 850 + }, 851 + mt_2xl: { 852 + marginTop: tokens.space._2xl, 853 + }, 854 + mt_3xl: { 855 + marginTop: tokens.space._3xl, 856 + }, 857 + mt_4xl: { 858 + marginTop: tokens.space._4xl, 859 + }, 860 + mt_5xl: { 861 + marginTop: tokens.space._5xl, 862 + }, 863 + mt_auto: { 864 + marginTop: 'auto', 865 + }, 866 + mb_0: { 867 + marginBottom: 0, 868 + }, 869 + mb_2xs: { 870 + marginBottom: tokens.space._2xs, 871 + }, 872 + mb_xs: { 873 + marginBottom: tokens.space.xs, 874 + }, 875 + mb_sm: { 876 + marginBottom: tokens.space.sm, 877 + }, 878 + mb_md: { 879 + marginBottom: tokens.space.md, 880 + }, 881 + mb_lg: { 882 + marginBottom: tokens.space.lg, 883 + }, 884 + mb_xl: { 885 + marginBottom: tokens.space.xl, 886 + }, 887 + mb_2xl: { 888 + marginBottom: tokens.space._2xl, 889 + }, 890 + mb_3xl: { 891 + marginBottom: tokens.space._3xl, 892 + }, 893 + mb_4xl: { 894 + marginBottom: tokens.space._4xl, 895 + }, 896 + mb_5xl: { 897 + marginBottom: tokens.space._5xl, 898 + }, 899 + mb_auto: { 900 + marginBottom: 'auto', 901 + }, 902 + ml_0: { 903 + marginLeft: 0, 904 + }, 905 + ml_2xs: { 906 + marginLeft: tokens.space._2xs, 907 + }, 908 + ml_xs: { 909 + marginLeft: tokens.space.xs, 910 + }, 911 + ml_sm: { 912 + marginLeft: tokens.space.sm, 913 + }, 914 + ml_md: { 915 + marginLeft: tokens.space.md, 916 + }, 917 + ml_lg: { 918 + marginLeft: tokens.space.lg, 919 + }, 920 + ml_xl: { 921 + marginLeft: tokens.space.xl, 922 + }, 923 + ml_2xl: { 924 + marginLeft: tokens.space._2xl, 925 + }, 926 + ml_3xl: { 927 + marginLeft: tokens.space._3xl, 928 + }, 929 + ml_4xl: { 930 + marginLeft: tokens.space._4xl, 931 + }, 932 + ml_5xl: { 933 + marginLeft: tokens.space._5xl, 934 + }, 935 + ml_auto: { 936 + marginLeft: 'auto', 937 + }, 938 + mr_0: { 939 + marginRight: 0, 940 + }, 941 + mr_2xs: { 942 + marginRight: tokens.space._2xs, 943 + }, 944 + mr_xs: { 945 + marginRight: tokens.space.xs, 946 + }, 947 + mr_sm: { 948 + marginRight: tokens.space.sm, 949 + }, 950 + mr_md: { 951 + marginRight: tokens.space.md, 952 + }, 953 + mr_lg: { 954 + marginRight: tokens.space.lg, 955 + }, 956 + mr_xl: { 957 + marginRight: tokens.space.xl, 958 + }, 959 + mr_2xl: { 960 + marginRight: tokens.space._2xl, 961 + }, 962 + mr_3xl: { 963 + marginRight: tokens.space._3xl, 964 + }, 965 + mr_4xl: { 966 + marginRight: tokens.space._4xl, 967 + }, 968 + mr_5xl: { 969 + marginRight: tokens.space._5xl, 970 + }, 971 + mr_auto: { 972 + marginRight: 'auto', 973 + }, 974 + 975 + /* 976 + * Pointer events & user select 977 + */ 978 + pointer_events_none: { 979 + pointerEvents: 'none', 980 + }, 981 + pointer_events_auto: { 982 + pointerEvents: 'auto', 983 + }, 984 + user_select_none: { 985 + userSelect: 'none', 986 + }, 987 + user_select_text: { 988 + userSelect: 'text', 989 + }, 990 + user_select_all: { 991 + userSelect: 'all', 992 + }, 993 + outline_inset_1: { 994 + outlineOffset: -1, 995 + }, 996 + 997 + /* 998 + * Text decoration 999 + */ 1000 + underline: { 1001 + textDecorationLine: 'underline', 1002 + }, 1003 + strike_through: { 1004 + textDecorationLine: 'line-through', 1005 + }, 1006 + 1007 + /* 1008 + * Display 1009 + */ 1010 + hidden: { 1011 + display: 'none', 1012 + }, 1013 + inline: web({ 1014 + display: 'inline', 1015 + }), 1016 + block: web({ 1017 + display: 'block', 1018 + }), 1019 + contents: web({ 1020 + display: 'contents', 1021 + }), 1022 + 1023 + /* 35 1024 * Transition 36 1025 */ 37 1026 transition_none: web({ ··· 110 1099 transform: [], 111 1100 }, 112 1101 }) as {transform: Exclude<ViewStyle['transform'], string | undefined>}, 1102 + 1103 + pointer: web({ 1104 + cursor: 'pointer', 1105 + }), 113 1106 } as const
+5 -5
src/alf/fonts.ts
··· 7 7 8 8 const factor = 0.0625 // 1 - (15/16) 9 9 const fontScaleMultipliers: Record<Device['fontScale'], number> = { 10 - '-2': 1 - factor * 1, // unused 11 - '-1': 1 - factor * 1, 12 - '0': 1, // default 13 - '1': 1 + factor * 1, 14 - '2': 1 + factor * 1, // unused 10 + '-2': 1 - factor * 3, 11 + '-1': 1 - factor * 2, 12 + '0': 1 - factor * 1, // default 13 + '1': 1, 14 + '2': 1 + factor * 1, 15 15 } 16 16 17 17 export function computeFontScaleMultiplier(scale: Device['fontScale']) {
+30 -13
src/alf/index.tsx
··· 1 1 import React from 'react' 2 - import {type Theme, type ThemeName} from '@bsky.app/alf' 3 2 4 3 import { 5 4 computeFontScaleMultiplier, ··· 8 7 setFontFamily as persistFontFamily, 9 8 setFontScale as persistFontScale, 10 9 } from '#/alf/fonts' 11 - import {themes} from '#/alf/themes' 10 + import {createThemes, defaultTheme} from '#/alf/themes' 11 + import {type Theme, type ThemeName} from '#/alf/types' 12 + import {BLUE_HUE, GREEN_HUE, RED_HUE} from '#/alf/util/colorGeneration' 12 13 import {type Device} from '#/storage' 13 14 14 - export {type TextStyleProp, type Theme, type ViewStyleProp} from '@bsky.app/alf' 15 15 export {atoms} from '#/alf/atoms' 16 16 export * from '#/alf/breakpoints' 17 17 export * from '#/alf/fonts' 18 18 export * as tokens from '#/alf/tokens' 19 + export * from '#/alf/types' 19 20 export * from '#/alf/util/flatten' 20 21 export * from '#/alf/util/platform' 21 22 export * from '#/alf/util/themeSelector' ··· 24 25 export type Alf = { 25 26 themeName: ThemeName 26 27 theme: Theme 27 - themes: typeof themes 28 + themes: ReturnType<typeof createThemes> 28 29 fonts: { 29 30 scale: Exclude<Device['fontScale'], undefined> 30 31 scaleMultiplier: number ··· 43 44 */ 44 45 export const Context = React.createContext<Alf>({ 45 46 themeName: 'light', 46 - theme: themes.light, 47 - themes, 47 + theme: defaultTheme, 48 + themes: createThemes({ 49 + hues: { 50 + primary: BLUE_HUE, 51 + negative: RED_HUE, 52 + positive: GREEN_HUE, 53 + }, 54 + }), 48 55 fonts: { 49 56 scale: getFontScale(), 50 57 scaleMultiplier: computeFontScaleMultiplier(getFontScale()), ··· 69 76 const setFontScaleAndPersist = React.useCallback< 70 77 Alf['fonts']['setFontScale'] 71 78 >( 72 - fs => { 73 - setFontScale(fs) 74 - persistFontScale(fs) 75 - setFontScaleMultiplier(computeFontScaleMultiplier(fs)) 79 + fontScale => { 80 + setFontScale(fontScale) 81 + persistFontScale(fontScale) 82 + setFontScaleMultiplier(computeFontScaleMultiplier(fontScale)) 76 83 }, 77 84 [setFontScale], 78 85 ) ··· 82 89 const setFontFamilyAndPersist = React.useCallback< 83 90 Alf['fonts']['setFontFamily'] 84 91 >( 85 - ff => { 86 - setFontFamily(ff) 87 - persistFontFamily(ff) 92 + fontFamily => { 93 + setFontFamily(fontFamily) 94 + persistFontFamily(fontFamily) 88 95 }, 89 96 [setFontFamily], 90 97 ) 98 + const themes = React.useMemo(() => { 99 + return createThemes({ 100 + hues: { 101 + primary: BLUE_HUE, 102 + negative: RED_HUE, 103 + positive: GREEN_HUE, 104 + }, 105 + }) 106 + }, []) 91 107 92 108 const value = React.useMemo<Alf>( 93 109 () => ({ ··· 105 121 }), 106 122 [ 107 123 themeName, 124 + themes, 108 125 fontScale, 109 126 setFontScaleAndPersist, 110 127 fontFamily,
+556 -27
src/alf/themes.ts
··· 1 1 import {atoms} from '#/alf/atoms' 2 2 import {mocha} from '#/alf/catppuccin/palette' 3 3 import {type Palette, type Theme} from '#/alf/types' 4 + import {type Palette, type Theme} from '#/alf/types' 4 5 import {defaultScale, dimScale} from '#/alf/util/colorGeneration' 6 + import { 7 + BLUE_HUE, 8 + defaultScale, 9 + dimScale, 10 + GREEN_HUE, 11 + RED_HUE, 12 + } from '#/alf/util/colorGeneration' 5 13 import {fade} from '#/alf/util/colors' 6 14 7 - const DEFAULT_THEMES = createThemes({ 8 - defaultPalette: DEFAULT_PALETTE, 9 - subduedPalette: DEFAULT_SUBDUED_PALETTE, 15 + const themes = createThemes({ 16 + hues: { 17 + primary: BLUE_HUE, 18 + negative: RED_HUE, 19 + positive: GREEN_HUE, 20 + }, 10 21 }) 11 22 12 23 /** ··· 603 614 } 604 615 } 605 616 606 - /** 607 - * @deprecated use ALF and access palette from `useTheme()` 608 - */ 609 - export const lightPalette = DEFAULT_THEMES.light.palette 610 - /** 611 - * @deprecated use ALF and access palette from `useTheme()` 612 - */ 613 - export const darkPalette = DEFAULT_THEMES.dark.palette 614 - /** 615 - * @deprecated use ALF and access palette from `useTheme()` 616 - */ 617 - export const dimPalette = DEFAULT_THEMES.dim.palette 618 - /** 619 - * @deprecated use ALF and access theme from `useTheme()` 620 - */ 621 - export const light = DEFAULT_THEMES.light 622 - /** 623 - * @deprecated use ALF and access theme from `useTheme()` 624 - */ 625 - export const dark = DEFAULT_THEMES.dark 626 - /** 627 - * @deprecated use ALF and access theme from `useTheme()` 628 - */ 629 - export const dim = DEFAULT_THEMES.dim 617 + export const defaultTheme = themes.light 618 + 619 + export function createThemes({ 620 + hues, 621 + }: { 622 + hues: { 623 + primary: number 624 + negative: number 625 + positive: number 626 + } 627 + }): { 628 + lightPalette: Palette 629 + darkPalette: Palette 630 + dimPalette: Palette 631 + light: Theme 632 + dark: Theme 633 + dim: Theme 634 + } { 635 + const color = { 636 + like: '#ec4899', 637 + trueBlack: '#000000', 638 + 639 + gray_0: `hsl(${hues.primary}, 20%, ${defaultScale[14]}%)`, 640 + gray_25: `hsl(${hues.primary}, 20%, ${defaultScale[13]}%)`, 641 + gray_50: `hsl(${hues.primary}, 20%, ${defaultScale[12]}%)`, 642 + gray_100: `hsl(${hues.primary}, 20%, ${defaultScale[11]}%)`, 643 + gray_200: `hsl(${hues.primary}, 20%, ${defaultScale[10]}%)`, 644 + gray_300: `hsl(${hues.primary}, 20%, ${defaultScale[9]}%)`, 645 + gray_400: `hsl(${hues.primary}, 20%, ${defaultScale[8]}%)`, 646 + gray_500: `hsl(${hues.primary}, 20%, ${defaultScale[7]}%)`, 647 + gray_600: `hsl(${hues.primary}, 24%, ${defaultScale[6]}%)`, 648 + gray_700: `hsl(${hues.primary}, 24%, ${defaultScale[5]}%)`, 649 + gray_800: `hsl(${hues.primary}, 28%, ${defaultScale[4]}%)`, 650 + gray_900: `hsl(${hues.primary}, 28%, ${defaultScale[3]}%)`, 651 + gray_950: `hsl(${hues.primary}, 28%, ${defaultScale[2]}%)`, 652 + gray_975: `hsl(${hues.primary}, 28%, ${defaultScale[1]}%)`, 653 + gray_1000: `hsl(${hues.primary}, 28%, ${defaultScale[0]}%)`, 654 + 655 + primary_25: `hsl(${hues.primary}, 99%, 97%)`, 656 + primary_50: `hsl(${hues.primary}, 99%, 95%)`, 657 + primary_100: `hsl(${hues.primary}, 99%, 90%)`, 658 + primary_200: `hsl(${hues.primary}, 99%, 80%)`, 659 + primary_300: `hsl(${hues.primary}, 99%, 70%)`, 660 + primary_400: `hsl(${hues.primary}, 99%, 60%)`, 661 + primary_500: `hsl(${hues.primary}, 99%, 53%)`, 662 + primary_600: `hsl(${hues.primary}, 99%, 42%)`, 663 + primary_700: `hsl(${hues.primary}, 99%, 34%)`, 664 + primary_800: `hsl(${hues.primary}, 99%, 26%)`, 665 + primary_900: `hsl(${hues.primary}, 99%, 18%)`, 666 + primary_950: `hsl(${hues.primary}, 99%, 10%)`, 667 + primary_975: `hsl(${hues.primary}, 99%, 7%)`, 668 + 669 + green_25: `hsl(${hues.positive}, 82%, 97%)`, 670 + green_50: `hsl(${hues.positive}, 82%, 95%)`, 671 + green_100: `hsl(${hues.positive}, 82%, 90%)`, 672 + green_200: `hsl(${hues.positive}, 82%, 80%)`, 673 + green_300: `hsl(${hues.positive}, 82%, 70%)`, 674 + green_400: `hsl(${hues.positive}, 82%, 60%)`, 675 + green_500: `hsl(${hues.positive}, 82%, 50%)`, 676 + green_600: `hsl(${hues.positive}, 82%, 42%)`, 677 + green_700: `hsl(${hues.positive}, 82%, 34%)`, 678 + green_800: `hsl(${hues.positive}, 82%, 26%)`, 679 + green_900: `hsl(${hues.positive}, 82%, 18%)`, 680 + green_950: `hsl(${hues.positive}, 82%, 10%)`, 681 + green_975: `hsl(${hues.positive}, 82%, 7%)`, 682 + 683 + red_25: `hsl(${hues.negative}, 91%, 97%)`, 684 + red_50: `hsl(${hues.negative}, 91%, 95%)`, 685 + red_100: `hsl(${hues.negative}, 91%, 90%)`, 686 + red_200: `hsl(${hues.negative}, 91%, 80%)`, 687 + red_300: `hsl(${hues.negative}, 91%, 70%)`, 688 + red_400: `hsl(${hues.negative}, 91%, 60%)`, 689 + red_500: `hsl(${hues.negative}, 91%, 50%)`, 690 + red_600: `hsl(${hues.negative}, 91%, 42%)`, 691 + red_700: `hsl(${hues.negative}, 91%, 34%)`, 692 + red_800: `hsl(${hues.negative}, 91%, 26%)`, 693 + red_900: `hsl(${hues.negative}, 91%, 18%)`, 694 + red_950: `hsl(${hues.negative}, 91%, 10%)`, 695 + red_975: `hsl(${hues.negative}, 91%, 7%)`, 696 + } as const 697 + 698 + const lightPalette = { 699 + white: color.gray_0, 700 + black: color.gray_1000, 701 + like: color.like, 702 + 703 + contrast_25: color.gray_25, 704 + contrast_50: color.gray_50, 705 + contrast_100: color.gray_100, 706 + contrast_200: color.gray_200, 707 + contrast_300: color.gray_300, 708 + contrast_400: color.gray_400, 709 + contrast_500: color.gray_500, 710 + contrast_600: color.gray_600, 711 + contrast_700: color.gray_700, 712 + contrast_800: color.gray_800, 713 + contrast_900: color.gray_900, 714 + contrast_950: color.gray_950, 715 + contrast_975: color.gray_975, 716 + 717 + primary_25: color.primary_25, 718 + primary_50: color.primary_50, 719 + primary_100: color.primary_100, 720 + primary_200: color.primary_200, 721 + primary_300: color.primary_300, 722 + primary_400: color.primary_400, 723 + primary_500: color.primary_500, 724 + primary_600: color.primary_600, 725 + primary_700: color.primary_700, 726 + primary_800: color.primary_800, 727 + primary_900: color.primary_900, 728 + primary_950: color.primary_950, 729 + primary_975: color.primary_975, 730 + 731 + positive_25: color.green_25, 732 + positive_50: color.green_50, 733 + positive_100: color.green_100, 734 + positive_200: color.green_200, 735 + positive_300: color.green_300, 736 + positive_400: color.green_400, 737 + positive_500: color.green_500, 738 + positive_600: color.green_600, 739 + positive_700: color.green_700, 740 + positive_800: color.green_800, 741 + positive_900: color.green_900, 742 + positive_950: color.green_950, 743 + positive_975: color.green_975, 744 + 745 + negative_25: color.red_25, 746 + negative_50: color.red_50, 747 + negative_100: color.red_100, 748 + negative_200: color.red_200, 749 + negative_300: color.red_300, 750 + negative_400: color.red_400, 751 + negative_500: color.red_500, 752 + negative_600: color.red_600, 753 + negative_700: color.red_700, 754 + negative_800: color.red_800, 755 + negative_900: color.red_900, 756 + negative_950: color.red_950, 757 + negative_975: color.red_975, 758 + } as const 759 + 760 + const darkPalette: Palette = { 761 + white: color.gray_25, 762 + black: color.trueBlack, 763 + like: color.like, 764 + 765 + contrast_25: color.gray_975, 766 + contrast_50: color.gray_950, 767 + contrast_100: color.gray_900, 768 + contrast_200: color.gray_800, 769 + contrast_300: color.gray_700, 770 + contrast_400: color.gray_600, 771 + contrast_500: color.gray_500, 772 + contrast_600: color.gray_400, 773 + contrast_700: color.gray_300, 774 + contrast_800: color.gray_200, 775 + contrast_900: color.gray_100, 776 + contrast_950: color.gray_50, 777 + contrast_975: color.gray_25, 778 + 779 + primary_25: color.primary_975, 780 + primary_50: color.primary_950, 781 + primary_100: color.primary_900, 782 + primary_200: color.primary_800, 783 + primary_300: color.primary_700, 784 + primary_400: color.primary_600, 785 + primary_500: color.primary_500, 786 + primary_600: color.primary_400, 787 + primary_700: color.primary_300, 788 + primary_800: color.primary_200, 789 + primary_900: color.primary_100, 790 + primary_950: color.primary_50, 791 + primary_975: color.primary_25, 792 + 793 + positive_25: color.green_975, 794 + positive_50: color.green_950, 795 + positive_100: color.green_900, 796 + positive_200: color.green_800, 797 + positive_300: color.green_700, 798 + positive_400: color.green_600, 799 + positive_500: color.green_500, 800 + positive_600: color.green_400, 801 + positive_700: color.green_300, 802 + positive_800: color.green_200, 803 + positive_900: color.green_100, 804 + positive_950: color.green_50, 805 + positive_975: color.green_25, 806 + 807 + negative_25: color.red_975, 808 + negative_50: color.red_950, 809 + negative_100: color.red_900, 810 + negative_200: color.red_800, 811 + negative_300: color.red_700, 812 + negative_400: color.red_600, 813 + negative_500: color.red_500, 814 + negative_600: color.red_400, 815 + negative_700: color.red_300, 816 + negative_800: color.red_200, 817 + negative_900: color.red_100, 818 + negative_950: color.red_50, 819 + negative_975: color.red_25, 820 + } as const 821 + 822 + const dimPalette: Palette = { 823 + ...darkPalette, 824 + black: `hsl(${hues.primary}, 28%, ${dimScale[0]}%)`, 825 + like: color.like, 826 + 827 + contrast_25: `hsl(${hues.primary}, 28%, ${dimScale[1]}%)`, 828 + contrast_50: `hsl(${hues.primary}, 28%, ${dimScale[2]}%)`, 829 + contrast_100: `hsl(${hues.primary}, 28%, ${dimScale[3]}%)`, 830 + contrast_200: `hsl(${hues.primary}, 28%, ${dimScale[4]}%)`, 831 + contrast_300: `hsl(${hues.primary}, 24%, ${dimScale[5]}%)`, 832 + contrast_400: `hsl(${hues.primary}, 24%, ${dimScale[6]}%)`, 833 + contrast_500: `hsl(${hues.primary}, 20%, ${dimScale[7]}%)`, 834 + contrast_600: `hsl(${hues.primary}, 20%, ${dimScale[8]}%)`, 835 + contrast_700: `hsl(${hues.primary}, 20%, ${dimScale[9]}%)`, 836 + contrast_800: `hsl(${hues.primary}, 20%, ${dimScale[10]}%)`, 837 + contrast_900: `hsl(${hues.primary}, 20%, ${dimScale[11]}%)`, 838 + contrast_950: `hsl(${hues.primary}, 20%, ${dimScale[12]}%)`, 839 + contrast_975: `hsl(${hues.primary}, 20%, ${dimScale[13]}%)`, 840 + 841 + primary_25: `hsl(${hues.primary}, 50%, ${dimScale[1]}%)`, 842 + primary_50: `hsl(${hues.primary}, 60%, ${dimScale[2]}%)`, 843 + primary_100: `hsl(${hues.primary}, 70%, ${dimScale[3]}%)`, 844 + primary_200: `hsl(${hues.primary}, 82%, ${dimScale[4]}%)`, 845 + primary_300: `hsl(${hues.primary}, 90%, ${dimScale[5]}%)`, 846 + primary_400: `hsl(${hues.primary}, 95%, ${dimScale[6]}%)`, 847 + primary_500: `hsl(${hues.primary}, 99%, ${dimScale[7]}%)`, 848 + primary_600: `hsl(${hues.primary}, 99%, ${dimScale[8]}%)`, 849 + primary_700: `hsl(${hues.primary}, 99%, ${dimScale[9]}%)`, 850 + primary_800: `hsl(${hues.primary}, 99%, ${dimScale[10]}%)`, 851 + primary_900: `hsl(${hues.primary}, 99%, ${dimScale[11]}%)`, 852 + primary_950: `hsl(${hues.primary}, 99%, ${dimScale[12]}%)`, 853 + primary_975: `hsl(${hues.primary}, 99%, ${dimScale[13]}%)`, 854 + 855 + positive_25: `hsl(${hues.positive}, 50%, ${dimScale[1]}%)`, 856 + positive_50: `hsl(${hues.positive}, 60%, ${dimScale[2]}%)`, 857 + positive_100: `hsl(${hues.positive}, 70%, ${dimScale[3]}%)`, 858 + positive_200: `hsl(${hues.positive}, 82%, ${dimScale[4]}%)`, 859 + positive_300: `hsl(${hues.positive}, 82%, ${dimScale[5]}%)`, 860 + positive_400: `hsl(${hues.positive}, 82%, ${dimScale[6]}%)`, 861 + positive_500: `hsl(${hues.positive}, 82%, ${dimScale[7]}%)`, 862 + positive_600: `hsl(${hues.positive}, 82%, ${dimScale[8]}%)`, 863 + positive_700: `hsl(${hues.positive}, 82%, ${dimScale[9]}%)`, 864 + positive_800: `hsl(${hues.positive}, 82%, ${dimScale[10]}%)`, 865 + positive_900: `hsl(${hues.positive}, 82%, ${dimScale[11]}%)`, 866 + positive_950: `hsl(${hues.positive}, 82%, ${dimScale[12]}%)`, 867 + positive_975: `hsl(${hues.positive}, 82%, ${dimScale[13]}%)`, 868 + 869 + negative_25: `hsl(${hues.negative}, 70%, ${dimScale[1]}%)`, 870 + negative_50: `hsl(${hues.negative}, 80%, ${dimScale[2]}%)`, 871 + negative_100: `hsl(${hues.negative}, 84%, ${dimScale[3]}%)`, 872 + negative_200: `hsl(${hues.negative}, 88%, ${dimScale[4]}%)`, 873 + negative_300: `hsl(${hues.negative}, 91%, ${dimScale[5]}%)`, 874 + negative_400: `hsl(${hues.negative}, 91%, ${dimScale[6]}%)`, 875 + negative_500: `hsl(${hues.negative}, 91%, ${dimScale[7]}%)`, 876 + negative_600: `hsl(${hues.negative}, 91%, ${dimScale[8]}%)`, 877 + negative_700: `hsl(${hues.negative}, 91%, ${dimScale[9]}%)`, 878 + negative_800: `hsl(${hues.negative}, 91%, ${dimScale[10]}%)`, 879 + negative_900: `hsl(${hues.negative}, 91%, ${dimScale[11]}%)`, 880 + negative_950: `hsl(${hues.negative}, 91%, ${dimScale[12]}%)`, 881 + negative_975: `hsl(${hues.negative}, 91%, ${dimScale[13]}%)`, 882 + } as const 883 + 884 + const light: Theme = { 885 + scheme: 'light', 886 + name: 'light', 887 + palette: lightPalette, 888 + atoms: { 889 + text: { 890 + color: lightPalette.black, 891 + }, 892 + text_contrast_low: { 893 + color: lightPalette.contrast_400, 894 + }, 895 + text_contrast_medium: { 896 + color: lightPalette.contrast_700, 897 + }, 898 + text_contrast_high: { 899 + color: lightPalette.contrast_900, 900 + }, 901 + text_inverted: { 902 + color: lightPalette.white, 903 + }, 904 + bg: { 905 + backgroundColor: lightPalette.white, 906 + }, 907 + bg_contrast_25: { 908 + backgroundColor: lightPalette.contrast_25, 909 + }, 910 + bg_contrast_50: { 911 + backgroundColor: lightPalette.contrast_50, 912 + }, 913 + bg_contrast_100: { 914 + backgroundColor: lightPalette.contrast_100, 915 + }, 916 + bg_contrast_200: { 917 + backgroundColor: lightPalette.contrast_200, 918 + }, 919 + bg_contrast_300: { 920 + backgroundColor: lightPalette.contrast_300, 921 + }, 922 + bg_contrast_400: { 923 + backgroundColor: lightPalette.contrast_400, 924 + }, 925 + bg_contrast_500: { 926 + backgroundColor: lightPalette.contrast_500, 927 + }, 928 + bg_contrast_600: { 929 + backgroundColor: lightPalette.contrast_600, 930 + }, 931 + bg_contrast_700: { 932 + backgroundColor: lightPalette.contrast_700, 933 + }, 934 + bg_contrast_800: { 935 + backgroundColor: lightPalette.contrast_800, 936 + }, 937 + bg_contrast_900: { 938 + backgroundColor: lightPalette.contrast_900, 939 + }, 940 + bg_contrast_950: { 941 + backgroundColor: lightPalette.contrast_950, 942 + }, 943 + bg_contrast_975: { 944 + backgroundColor: lightPalette.contrast_975, 945 + }, 946 + border_contrast_low: { 947 + borderColor: lightPalette.contrast_100, 948 + }, 949 + border_contrast_medium: { 950 + borderColor: lightPalette.contrast_200, 951 + }, 952 + border_contrast_high: { 953 + borderColor: lightPalette.contrast_300, 954 + }, 955 + shadow_sm: { 956 + ...atoms.shadow_sm, 957 + shadowColor: lightPalette.black, 958 + }, 959 + shadow_md: { 960 + ...atoms.shadow_md, 961 + shadowColor: lightPalette.black, 962 + }, 963 + shadow_lg: { 964 + ...atoms.shadow_lg, 965 + shadowColor: lightPalette.black, 966 + }, 967 + }, 968 + } 969 + 970 + const dark: Theme = { 971 + scheme: 'dark', 972 + name: 'dark', 973 + palette: darkPalette, 974 + atoms: { 975 + text: { 976 + color: darkPalette.white, 977 + }, 978 + text_contrast_low: { 979 + color: darkPalette.contrast_400, 980 + }, 981 + text_contrast_medium: { 982 + color: darkPalette.contrast_600, 983 + }, 984 + text_contrast_high: { 985 + color: darkPalette.contrast_900, 986 + }, 987 + text_inverted: { 988 + color: darkPalette.black, 989 + }, 990 + bg: { 991 + backgroundColor: darkPalette.black, 992 + }, 993 + bg_contrast_25: { 994 + backgroundColor: darkPalette.contrast_25, 995 + }, 996 + bg_contrast_50: { 997 + backgroundColor: darkPalette.contrast_50, 998 + }, 999 + bg_contrast_100: { 1000 + backgroundColor: darkPalette.contrast_100, 1001 + }, 1002 + bg_contrast_200: { 1003 + backgroundColor: darkPalette.contrast_200, 1004 + }, 1005 + bg_contrast_300: { 1006 + backgroundColor: darkPalette.contrast_300, 1007 + }, 1008 + bg_contrast_400: { 1009 + backgroundColor: darkPalette.contrast_400, 1010 + }, 1011 + bg_contrast_500: { 1012 + backgroundColor: darkPalette.contrast_500, 1013 + }, 1014 + bg_contrast_600: { 1015 + backgroundColor: darkPalette.contrast_600, 1016 + }, 1017 + bg_contrast_700: { 1018 + backgroundColor: darkPalette.contrast_700, 1019 + }, 1020 + bg_contrast_800: { 1021 + backgroundColor: darkPalette.contrast_800, 1022 + }, 1023 + bg_contrast_900: { 1024 + backgroundColor: darkPalette.contrast_900, 1025 + }, 1026 + bg_contrast_950: { 1027 + backgroundColor: darkPalette.contrast_950, 1028 + }, 1029 + bg_contrast_975: { 1030 + backgroundColor: darkPalette.contrast_975, 1031 + }, 1032 + border_contrast_low: { 1033 + borderColor: darkPalette.contrast_100, 1034 + }, 1035 + border_contrast_medium: { 1036 + borderColor: darkPalette.contrast_200, 1037 + }, 1038 + border_contrast_high: { 1039 + borderColor: darkPalette.contrast_300, 1040 + }, 1041 + shadow_sm: { 1042 + ...atoms.shadow_sm, 1043 + shadowOpacity: 0.7, 1044 + shadowColor: color.trueBlack, 1045 + }, 1046 + shadow_md: { 1047 + ...atoms.shadow_md, 1048 + shadowOpacity: 0.7, 1049 + shadowColor: color.trueBlack, 1050 + }, 1051 + shadow_lg: { 1052 + ...atoms.shadow_lg, 1053 + shadowOpacity: 0.7, 1054 + shadowColor: color.trueBlack, 1055 + }, 1056 + }, 1057 + } 1058 + 1059 + const dim: Theme = { 1060 + ...dark, 1061 + scheme: 'dark', 1062 + name: 'dim', 1063 + palette: dimPalette, 1064 + atoms: { 1065 + ...dark.atoms, 1066 + text: { 1067 + color: dimPalette.white, 1068 + }, 1069 + text_contrast_low: { 1070 + color: dimPalette.contrast_400, 1071 + }, 1072 + text_contrast_medium: { 1073 + color: dimPalette.contrast_600, 1074 + }, 1075 + text_contrast_high: { 1076 + color: dimPalette.contrast_900, 1077 + }, 1078 + text_inverted: { 1079 + color: dimPalette.black, 1080 + }, 1081 + bg: { 1082 + backgroundColor: dimPalette.black, 1083 + }, 1084 + bg_contrast_25: { 1085 + backgroundColor: dimPalette.contrast_25, 1086 + }, 1087 + bg_contrast_50: { 1088 + backgroundColor: dimPalette.contrast_50, 1089 + }, 1090 + bg_contrast_100: { 1091 + backgroundColor: dimPalette.contrast_100, 1092 + }, 1093 + bg_contrast_200: { 1094 + backgroundColor: dimPalette.contrast_200, 1095 + }, 1096 + bg_contrast_300: { 1097 + backgroundColor: dimPalette.contrast_300, 1098 + }, 1099 + bg_contrast_400: { 1100 + backgroundColor: dimPalette.contrast_400, 1101 + }, 1102 + bg_contrast_500: { 1103 + backgroundColor: dimPalette.contrast_500, 1104 + }, 1105 + bg_contrast_600: { 1106 + backgroundColor: dimPalette.contrast_600, 1107 + }, 1108 + bg_contrast_700: { 1109 + backgroundColor: dimPalette.contrast_700, 1110 + }, 1111 + bg_contrast_800: { 1112 + backgroundColor: dimPalette.contrast_800, 1113 + }, 1114 + bg_contrast_900: { 1115 + backgroundColor: dimPalette.contrast_900, 1116 + }, 1117 + bg_contrast_950: { 1118 + backgroundColor: dimPalette.contrast_950, 1119 + }, 1120 + bg_contrast_975: { 1121 + backgroundColor: dimPalette.contrast_975, 1122 + }, 1123 + border_contrast_low: { 1124 + borderColor: dimPalette.contrast_100, 1125 + }, 1126 + border_contrast_medium: { 1127 + borderColor: dimPalette.contrast_200, 1128 + }, 1129 + border_contrast_high: { 1130 + borderColor: dimPalette.contrast_300, 1131 + }, 1132 + shadow_sm: { 1133 + ...atoms.shadow_sm, 1134 + shadowOpacity: 0.7, 1135 + shadowColor: `hsl(${hues.primary}, 28%, 6%)`, 1136 + }, 1137 + shadow_md: { 1138 + ...atoms.shadow_md, 1139 + shadowOpacity: 0.7, 1140 + shadowColor: `hsl(${hues.primary}, 28%, 6%)`, 1141 + }, 1142 + shadow_lg: { 1143 + ...atoms.shadow_lg, 1144 + shadowOpacity: 0.7, 1145 + shadowColor: `hsl(${hues.primary}, 28%, 6%)`, 1146 + }, 1147 + }, 1148 + } 1149 + 1150 + return { 1151 + lightPalette, 1152 + darkPalette, 1153 + dimPalette, 1154 + light, 1155 + dark, 1156 + dim, 1157 + } 1158 + }
+55 -4
src/alf/tokens.ts
··· 1 - import {tokens} from '@bsky.app/alf' 1 + import {isAndroid} from '#/platform/detection' 2 2 3 - export * from '@bsky.app/alf/dist/tokens' 3 + export const TRACKING = isAndroid ? 0.1 : 0 4 4 5 5 export const color = { 6 - temp_purple: tokens.labelerColor.purple, 7 - temp_purple_dark: tokens.labelerColor.purple_dark, 6 + temp_purple: 'rgb(105 0 255)', 7 + temp_purple_dark: 'rgb(83 0 202)', 8 + } as const 9 + 10 + export const space = { 11 + _2xs: 2, 12 + xs: 4, 13 + sm: 8, 14 + md: 12, 15 + lg: 16, 16 + xl: 20, 17 + _2xl: 24, 18 + _3xl: 28, 19 + _4xl: 32, 20 + _5xl: 40, 21 + } as const 22 + 23 + export const fontSize = { 24 + _2xs: 10, 25 + xs: 12, 26 + sm: 14, 27 + md: 16, 28 + lg: 18, 29 + xl: 20, 30 + _2xl: 22, 31 + _3xl: 26, 32 + _4xl: 32, 33 + _5xl: 40, 34 + } as const 35 + 36 + export const lineHeight = { 37 + none: 1, 38 + normal: 1.5, 39 + relaxed: 1.625, 40 + } as const 41 + 42 + export const borderRadius = { 43 + _2xs: 2, 44 + xs: 4, 45 + sm: 8, 46 + md: 12, 47 + lg: 16, 48 + full: 999, 49 + } as const 50 + 51 + /** 52 + * These correspond to Inter font files we actually load. 53 + */ 54 + export const fontWeight = { 55 + normal: '400', 56 + medium: '500', 57 + bold: '600', 58 + heavy: '800', 8 59 } as const 9 60 10 61 export const gradients = {
+15
src/alf/typography.tsx
··· 9 9 import {type Alf, applyFonts, atoms, flatten} from '#/alf' 10 10 11 11 /** 12 + * Util to calculate lineHeight from a text size atom and a leading atom 13 + * 14 + * Example: 15 + * `leading(atoms.text_md, atoms.leading_normal)` // => 24 16 + */ 17 + export function leading< 18 + Size extends {fontSize?: number}, 19 + Leading extends {lineHeight?: number}, 20 + >(textSize: Size, leading: Leading) { 21 + const size = textSize?.fontSize || atoms.text_md.fontSize 22 + const lineHeight = leading?.lineHeight || atoms.leading_normal.lineHeight 23 + return Math.round(size * lineHeight) 24 + } 25 + 26 + /** 12 27 * Ensures that `lineHeight` defaults to a relative value of `1`, or applies 13 28 * other relative leading atoms. 14 29 *
+8
src/alf/util/__tests__/colors.test.ts
··· 1 1 import {jest} from '@jest/globals' 2 2 3 + import {logger} from '#/logger' 3 4 import {transparentifyColor} from '../colorGeneration' 5 + 6 + jest.mock('#/logger', () => ({ 7 + logger: {warn: jest.fn()}, 8 + })) 4 9 5 10 describe('transparentifyColor', () => { 6 11 beforeEach(() => { ··· 36 41 const unsupported = 'blue' 37 42 const result = transparentifyColor(unsupported, 0.5) 38 43 expect(result).toBe(unsupported) 44 + expect(logger.warn).toHaveBeenCalledWith( 45 + `Could not make '${unsupported}' transparent`, 46 + ) 39 47 }) 40 48 })
+62 -1
src/alf/util/platform.ts
··· 1 - export {android, ios, native, platform, web} from '@bsky.app/alf' 1 + import {Platform} from 'react-native' 2 + 3 + import {isAndroid, isIOS, isNative, isWeb} from '#/platform/detection' 4 + 5 + /** 6 + * Identity function on web. Returns nothing on other platforms. 7 + * 8 + * Note: Platform splitting does not tree-shake away the other platforms, 9 + * so don't do stuff like e.g. rely on platform-specific imports. Use 10 + * platform-split files instead. 11 + */ 12 + export function web(value: any) { 13 + if (isWeb) { 14 + return value 15 + } 16 + } 17 + 18 + /** 19 + * Identity function on iOS. Returns nothing on other platforms. 20 + * 21 + * Note: Platform splitting does not tree-shake away the other platforms, 22 + * so don't do stuff like e.g. rely on platform-specific imports. Use 23 + * platform-split files instead. 24 + */ 25 + export function ios(value: any) { 26 + if (isIOS) { 27 + return value 28 + } 29 + } 30 + 31 + /** 32 + * Identity function on Android. Returns nothing on other platforms.. 33 + * 34 + * Note: Platform splitting does not tree-shake away the other platforms, 35 + * so don't do stuff like e.g. rely on platform-specific imports. Use 36 + * platform-split files instead. 37 + */ 38 + export function android(value: any) { 39 + if (isAndroid) { 40 + return value 41 + } 42 + } 43 + 44 + /** 45 + * Identity function on iOS and Android. Returns nothing on web. 46 + * 47 + * Note: Platform splitting does not tree-shake away the other platforms, 48 + * so don't do stuff like e.g. rely on platform-specific imports. Use 49 + * platform-split files instead. 50 + */ 51 + export function native(value: any) { 52 + if (isNative) { 53 + return value 54 + } 55 + } 56 + 57 + /** 58 + * Note: Platform splitting does not tree-shake away the other platforms, 59 + * so don't do stuff like e.g. rely on platform-specific imports. Use 60 + * platform-split files instead. 61 + */ 62 + export const platform = Platform.select
+1 -1
src/alf/util/systemUI.ts
··· 1 1 import * as SystemUI from 'expo-system-ui' 2 - import {type Theme} from '@bsky.app/alf' 3 2 4 3 import {isAndroid} from '#/platform/detection' 4 + import {type Theme} from '../types' 5 5 6 6 export function setSystemUITheme(themeType: 'theme' | 'lightbox', t: Theme) { 7 7 if (isAndroid) {
+13 -2
src/alf/util/themeSelector.ts
··· 1 - import {utils} from '@bsky.app/alf' 1 + import {type ThemeName} from '#/alf/types' 2 2 3 - export const select = utils.select 3 + export function select<T>(name: ThemeName, options: Record<ThemeName, T>) { 4 + switch (name) { 5 + case 'light': 6 + return options.light 7 + case 'dark': 8 + return options.dark || options.dim 9 + case 'dim': 10 + return options.dim || options.dark 11 + default: 12 + throw new Error(`select(theme, options) received unknown theme ${name}`) 13 + } 14 + }
+1 -1
src/alf/util/useColorModeTheme.ts
··· 1 1 import React from 'react' 2 2 import {type ColorSchemeName, useColorScheme} from 'react-native' 3 - import {type ThemeName} from '@bsky.app/alf' 4 3 5 4 import {isWeb} from '#/platform/detection' 6 5 import {useThemePrefs} from '#/state/shell' 7 6 import {dark, dim, light} from '#/alf/themes' 7 + import {type ThemeName} from '#/alf/types' 8 8 9 9 export function useColorModeTheme(): ThemeName { 10 10 const theme = useThemeName()
+2 -2
src/components/AccountList.tsx
··· 77 77 ]}> 78 78 <Text 79 79 style={[ 80 - a.font_semi_bold, 80 + a.font_bold, 81 81 a.flex_1, 82 82 a.flex_row, 83 83 a.py_sm, ··· 151 151 <View style={[a.flex_row, a.align_center, a.gap_xs]}> 152 152 <Text 153 153 emoji 154 - style={[a.font_semi_bold, a.leading_tight]} 154 + style={[a.font_bold, a.leading_tight]} 155 155 numberOfLines={1}> 156 156 {sanitizeDisplayName( 157 157 profile?.displayName || profile?.handle || account.handle,
+3 -2
src/components/BlockedGeoOverlay.tsx
··· 96 96 <Mark fill={t.palette.primary_600} width={14} /> 97 97 <Text 98 98 style={[ 99 - a.font_semi_bold, 99 + a.font_bold, 100 100 { 101 101 color: t.palette.primary_600, 102 102 }, ··· 121 121 </View> 122 122 123 123 <View style={[a.mt_xl, a.align_start]}> 124 - <Text style={[a.text_lg, a.font_bold, a.leading_snug, a.pb_xs]}> 124 + <Text 125 + style={[a.text_lg, a.font_heavy, a.leading_snug, a.pb_xs]}> 125 126 <Trans>Not in Mississippi?</Trans> 126 127 </Text> 127 128 <Text
+13 -5
src/components/Button.tsx
··· 240 240 } 241 241 } else if (color === 'secondary') { 242 242 if (!disabled) { 243 - baseStyles.push(t.atoms.bg_contrast_50) 243 + baseStyles.push(t.atoms.bg_contrast_25) 244 244 hoverStyles.push(t.atoms.bg_contrast_100) 245 245 } else { 246 246 baseStyles.push(t.atoms.bg_contrast_50) ··· 289 289 }) 290 290 } else { 291 291 baseStyles.push({ 292 - backgroundColor: t.palette.primary_50, 292 + backgroundColor: select(t.name, { 293 + light: t.palette.primary_25, 294 + dim: t.palette.primary_50, 295 + dark: t.palette.primary_50, 296 + }), 293 297 }) 294 298 } 295 299 } else if (color === 'negative_subtle') { ··· 310 314 }) 311 315 } else { 312 316 baseStyles.push({ 313 - backgroundColor: t.palette.negative_50, 317 + backgroundColor: select(t.name, { 318 + light: t.palette.negative_25, 319 + dim: t.palette.negative_50, 320 + dark: t.palette.negative_50, 321 + }), 314 322 }) 315 323 } 316 324 } ··· 364 372 if (!disabled) { 365 373 baseStyles.push(t.atoms.bg) 366 374 hoverStyles.push({ 367 - backgroundColor: t.palette.contrast_50, 375 + backgroundColor: t.palette.contrast_25, 368 376 }) 369 377 } 370 378 } ··· 388 396 if (!disabled) { 389 397 baseStyles.push(t.atoms.bg) 390 398 hoverStyles.push({ 391 - backgroundColor: t.palette.contrast_50, 399 + backgroundColor: t.palette.contrast_25, 392 400 }) 393 401 } 394 402 }
+2 -6
src/components/ContextMenu/index.tsx
··· 796 796 style={[ 797 797 a.flex_1, 798 798 a.text_md, 799 - a.font_semi_bold, 799 + a.font_bold, 800 800 t.atoms.text_contrast_high, 801 801 {paddingTop: 3}, 802 802 style, ··· 855 855 const t = useTheme() 856 856 return ( 857 857 <Text 858 - style={[ 859 - a.font_semi_bold, 860 - t.atoms.text_contrast_medium, 861 - {marginBottom: -8}, 862 - ]}> 858 + style={[a.font_bold, t.atoms.text_contrast_medium, {marginBottom: -8}]}> 863 859 {children} 864 860 </Text> 865 861 )
+1 -1
src/components/Dialog/shared.tsx
··· 62 62 style?: StyleProp<TextStyle> 63 63 }) { 64 64 return ( 65 - <Text style={[a.text_lg, a.text_center, a.font_bold, style]}> 65 + <Text style={[a.text_lg, a.text_center, a.font_heavy, style]}> 66 66 {children} 67 67 </Text> 68 68 )
+1 -1
src/components/Error.tsx
··· 40 40 ]} 41 41 sideBorders={sideBorders}> 42 42 <View style={[a.w_full, a.align_center, a.gap_lg]}> 43 - <Text style={[a.font_semi_bold, a.text_3xl]}>{title}</Text> 43 + <Text style={[a.font_bold, a.text_3xl]}>{title}</Text> 44 44 <Text 45 45 style={[ 46 46 a.text_md,
+2 -2
src/components/FeedCard.tsx
··· 128 128 <View style={[a.flex_1]}> 129 129 <Text 130 130 emoji 131 - style={[a.text_md, a.font_semi_bold, a.leading_snug]} 131 + style={[a.text_md, a.font_bold, a.leading_snug]} 132 132 numberOfLines={1}> 133 133 {title} 134 134 </Text> ··· 214 214 export function Likes({count}: {count: number}) { 215 215 const t = useTheme() 216 216 return ( 217 - <Text style={[a.text_sm, t.atoms.text_contrast_medium, a.font_semi_bold]}> 217 + <Text style={[a.text_sm, t.atoms.text_contrast_medium, a.font_bold]}> 218 218 <Trans> 219 219 Liked by <Plural value={count || 0} one="# user" other="# users" /> 220 220 </Trans>
+2 -2
src/components/FeedInterstitials.tsx
··· 380 380 a.justify_between, 381 381 ]} 382 382 pointerEvents={isIOS ? 'auto' : 'box-none'}> 383 - <Text style={[a.text_sm, a.font_semi_bold, t.atoms.text]}> 383 + <Text style={[a.text_sm, a.font_bold, t.atoms.text]}> 384 384 {isFeedContext ? ( 385 385 <Trans>Suggested for you</Trans> 386 386 ) : ( ··· 516 516 style={[ 517 517 a.flex_1, 518 518 a.text_lg, 519 - a.font_semi_bold, 519 + a.font_bold, 520 520 t.atoms.text_contrast_medium, 521 521 ]}> 522 522 <Trans>Some other feeds you might like</Trans>
+1 -1
src/components/LabelingServiceCard/index.tsx
··· 45 45 46 46 export function Title({value}: {value: string}) { 47 47 return ( 48 - <Text emoji style={[a.text_md, a.font_semi_bold, a.leading_tight]}> 48 + <Text emoji style={[a.text_md, a.font_bold, a.leading_tight]}> 49 49 {value} 50 50 </Text> 51 51 )
+1 -1
src/components/Layout/Header/index.tsx
··· 181 181 <Text 182 182 style={[ 183 183 a.text_lg, 184 - a.font_bold, 184 + a.font_heavy, 185 185 a.leading_tight, 186 186 isIOS && align === 'platform' && a.text_center, 187 187 gtMobile && a.text_xl,
+2 -2
src/components/ListCard.tsx
··· 127 127 allowOverride={creator && currentAccount?.did === creator.did}> 128 128 <Hider.Mask> 129 129 <Text 130 - style={[a.text_md, a.font_semi_bold, a.leading_snug, a.italic]} 130 + style={[a.text_md, a.font_bold, a.leading_snug, a.italic]} 131 131 numberOfLines={1}> 132 132 <Trans>Hidden list</Trans> 133 133 </Text> ··· 135 135 <Hider.Content> 136 136 <Text 137 137 emoji 138 - style={[a.text_md, a.font_semi_bold, a.leading_snug]} 138 + style={[a.text_md, a.font_bold, a.leading_snug]} 139 139 numberOfLines={1}> 140 140 {title} 141 141 </Text>
+1 -1
src/components/LoggedOutCTA.tsx
··· 50 50 <View style={[a.flex_row, a.align_center, a.flex_1, a.pr_md]}> 51 51 <Logo width={30} style={[a.mr_md]} /> 52 52 <View style={[a.flex_1]}> 53 - <Text style={[a.text_lg, a.font_semi_bold, a.leading_snug]}> 53 + <Text style={[a.text_lg, a.font_bold, a.leading_snug]}> 54 54 <Trans>Join Bluesky</Trans> 55 55 </Text> 56 56 <Text
+2 -2
src/components/Menu/index.tsx
··· 191 191 style={[ 192 192 a.flex_1, 193 193 a.text_md, 194 - a.font_semi_bold, 194 + a.font_bold, 195 195 t.atoms.text_contrast_high, 196 196 {paddingTop: 3}, 197 197 style, ··· 293 293 return ( 294 294 <Text 295 295 style={[ 296 - a.font_semi_bold, 296 + a.font_bold, 297 297 t.atoms.text_contrast_medium, 298 298 {marginBottom: -8}, 299 299 style,
+2 -2
src/components/Menu/index.web.tsx
··· 292 292 <Text 293 293 style={[ 294 294 a.flex_1, 295 - a.font_semi_bold, 295 + a.font_bold, 296 296 t.atoms.text_contrast_high, 297 297 style, 298 298 disabled && t.atoms.text_contrast_low, ··· 372 372 return ( 373 373 <Text 374 374 style={[ 375 - a.font_semi_bold, 375 + a.font_bold, 376 376 a.p_sm, 377 377 t.atoms.text_contrast_low, 378 378 a.leading_snug,
+1 -1
src/components/NewskieDialog.tsx
··· 135 135 style={[a.absolute, a.inset_0]} 136 136 /> 137 137 </View> 138 - <Text style={[a.font_semi_bold, a.text_xl]}> 138 + <Text style={[a.font_bold, a.text_xl]}> 139 139 {isMe ? <Trans>Welcome, friend!</Trans> : <Trans>Say hello!</Trans>} 140 140 </Text> 141 141 </View>
+1 -1
src/components/Pills.tsx
··· 133 133 emoji 134 134 style={[ 135 135 text, 136 - a.font_semi_bold, 136 + a.font_bold, 137 137 a.leading_tight, 138 138 t.atoms.text_contrast_medium, 139 139 {paddingRight: 3},
+1 -1
src/components/PolicyUpdateOverlay/Badge.tsx
··· 25 25 <Logo fill={t.palette.primary_600} width={14} /> 26 26 <Text 27 27 style={[ 28 - a.font_semi_bold, 28 + a.font_bold, 29 29 { 30 30 color: t.palette.primary_600, 31 31 },
+2 -2
src/components/PolicyUpdateOverlay/updates/202508/index.tsx
··· 69 69 70 70 {screenReaderEnabled ? ( 71 71 <View style={[a.gap_sm]}> 72 - <Text emoji style={[a.text_2xl, a.font_semi_bold, a.leading_snug]}> 72 + <Text emoji style={[a.text_2xl, a.font_bold, a.leading_snug]}> 73 73 <Trans>Hey there 👋</Trans> 74 74 </Text> 75 75 <Text style={[a.leading_snug, a.text_md]}> ··· 115 115 </View> 116 116 ) : ( 117 117 <View style={[a.gap_sm]}> 118 - <Text emoji style={[a.text_2xl, a.font_semi_bold, a.leading_snug]}> 118 + <Text emoji style={[a.text_2xl, a.font_bold, a.leading_snug]}> 119 119 <Trans>Hey there 👋</Trans> 120 120 </Text> 121 121 <Text style={[a.leading_snug, a.text_md]}>
+1 -1
src/components/Post/Embed/ExternalEmbed/index.tsx
··· 126 126 <Text 127 127 emoji 128 128 numberOfLines={3} 129 - style={[a.text_md, a.font_semi_bold, a.leading_snug]}> 129 + style={[a.text_md, a.font_bold, a.leading_snug]}> 130 130 {link.title || link.uri} 131 131 </Text> 132 132 )}
+1 -1
src/components/Post/Embed/VideoEmbed/VideoEmbedInner/TimeIndicator.tsx
··· 54 54 <Text 55 55 style={[ 56 56 {color: t.palette.white, fontSize: 12, fontVariant: ['tabular-nums']}, 57 - a.font_semi_bold, 57 + a.font_bold, 58 58 {lineHeight: 1.25}, 59 59 ]}> 60 60 {`${minutes}:${seconds}`}
+1 -6
src/components/PostControls/PostControlButton.tsx
··· 128 128 129 129 return ( 130 130 <Text 131 - style={[ 132 - color, 133 - big ? a.text_md : a.text_sm, 134 - active && a.font_semi_bold, 135 - style, 136 - ]} 131 + style={[color, big ? a.text_md : a.text_sm, active && a.font_bold, style]} 137 132 {...props} 138 133 /> 139 134 )
+2 -2
src/components/PostControls/RepostButton.tsx
··· 157 157 variant="ghost" 158 158 color="primary"> 159 159 <Repost size="lg" fill={t.palette.primary_500} /> 160 - <Text style={[a.font_semi_bold, a.text_xl]}> 160 + <Text style={[a.font_bold, a.text_xl]}> 161 161 {isReposted ? ( 162 162 <Trans>Remove repost</Trans> 163 163 ) : ( ··· 188 188 /> 189 189 <Text 190 190 style={[ 191 - a.font_semi_bold, 191 + a.font_bold, 192 192 a.text_xl, 193 193 embeddingDisabled && t.atoms.text_contrast_low, 194 194 ]}>
+1 -1
src/components/PostControls/ShareMenu/RecentChats.tsx
··· 203 203 a.text_sm, 204 204 t.atoms.text_contrast_high, 205 205 a.text_center, 206 - a.font_semi_bold, 206 + a.font_bold, 207 207 ]}> 208 208 <Trans>Start a conversation, and it will appear here.</Trans> 209 209 </Text>
+2 -2
src/components/ProfileCard.tsx
··· 233 233 <Text 234 234 emoji 235 235 style={[ 236 - a.font_semi_bold, 236 + a.font_bold, 237 237 a.leading_tight, 238 238 a.flex_shrink_0, 239 239 {maxWidth: '70%'}, ··· 287 287 emoji 288 288 style={[ 289 289 a.text_md, 290 - a.font_semi_bold, 290 + a.font_bold, 291 291 a.leading_snug, 292 292 a.self_start, 293 293 a.flex_shrink,
+3 -3
src/components/ProfileHoverCard/index.web.tsx
··· 515 515 <View style={[a.flex_row, a.align_center, a.pt_md, a.pb_xs]}> 516 516 <Text 517 517 numberOfLines={1} 518 - style={[a.text_lg, a.font_semi_bold, a.self_start]}> 518 + style={[a.text_lg, a.font_bold, a.self_start]}> 519 519 {sanitizeDisplayName( 520 520 profile.displayName || sanitizeHandle(profile.handle), 521 521 moderation.ui('displayName'), ··· 562 562 label={`${followers} ${pluralizedFollowers}`} 563 563 style={[t.atoms.text]} 564 564 onPress={hide}> 565 - <Text style={[a.text_md, a.font_semi_bold]}>{followers} </Text> 565 + <Text style={[a.text_md, a.font_bold]}>{followers} </Text> 566 566 <Text style={[t.atoms.text_contrast_medium]}> 567 567 {pluralizedFollowers} 568 568 </Text> ··· 572 572 label={_(msg`${following} following`)} 573 573 style={[t.atoms.text]} 574 574 onPress={hide}> 575 - <Text style={[a.text_md, a.font_semi_bold]}>{following} </Text> 575 + <Text style={[a.text_md, a.font_bold]}>{following} </Text> 576 576 <Text style={[t.atoms.text_contrast_medium]}> 577 577 {pluralizedFollowings} 578 578 </Text>
+1 -1
src/components/ProgressGuide/FollowDialog.tsx
··· 360 360 style={[ 361 361 a.z_10, 362 362 a.text_lg, 363 - a.font_bold, 363 + a.font_heavy, 364 364 a.leading_tight, 365 365 t.atoms.text_contrast_high, 366 366 ]}>
+1 -1
src/components/ProgressGuide/List.tsx
··· 28 28 <Text 29 29 style={[ 30 30 t.atoms.text_contrast_medium, 31 - a.font_semi_bold, 31 + a.font_bold, 32 32 a.text_sm, 33 33 {textTransform: 'uppercase'}, 34 34 ]}>
+1 -1
src/components/ProgressGuide/Task.tsx
··· 39 39 <Text 40 40 style={[ 41 41 a.text_sm, 42 - a.font_semi_bold, 42 + a.font_bold, 43 43 a.leading_tight, 44 44 tabularNumsTitle && {fontVariant: ['tabular-nums']}, 45 45 ]}>
+1 -1
src/components/ProgressGuide/Toast.tsx
··· 160 160 ref={animatedCheckRef} 161 161 /> 162 162 <View> 163 - <Text style={[a.text_md, a.font_semi_bold]}>{title}</Text> 163 + <Text style={[a.text_md, a.font_bold]}>{title}</Text> 164 164 {subtitle && ( 165 165 <Text style={[a.text_sm, t.atoms.text_contrast_medium]}> 166 166 {subtitle}
+1 -1
src/components/Prompt.tsx
··· 77 77 style={[ 78 78 a.flex_1, 79 79 a.text_2xl, 80 - a.font_semi_bold, 80 + a.font_bold, 81 81 a.pb_sm, 82 82 a.leading_snug, 83 83 style,
+2 -3
src/components/ReportDialog/SelectLabelerView.tsx
··· 24 24 return ( 25 25 <View style={[a.gap_lg]}> 26 26 <View style={[a.justify_center, gtMobile ? a.gap_sm : a.gap_xs]}> 27 - <Text style={[a.text_2xl, a.font_semi_bold]}> 27 + <Text style={[a.text_2xl, a.font_bold]}> 28 28 <Trans>Select moderator</Trans> 29 29 </Text> 30 30 <Text style={[a.text_md, t.atoms.text_contrast_medium]}> ··· 75 75 handle: labeler.creator.handle, 76 76 })} 77 77 /> 78 - <Text 79 - style={[t.atoms.text_contrast_medium, a.text_sm, a.font_semi_bold]}> 78 + <Text style={[t.atoms.text_contrast_medium, a.text_sm, a.font_bold]}> 80 79 @{labeler.creator.handle} 81 80 </Text> 82 81 </LabelingServiceCard.Content>
+2 -3
src/components/ReportDialog/SelectReportOptionView.tsx
··· 85 85 ) : null} 86 86 87 87 <View style={[a.justify_center, gtMobile ? a.gap_sm : a.gap_xs]}> 88 - <Text style={[a.text_2xl, a.font_semi_bold]}>{i18n.title}</Text> 88 + <Text style={[a.text_2xl, a.font_bold]}>{i18n.title}</Text> 89 89 <Text style={[a.text_md, t.atoms.text_contrast_medium]}> 90 90 {i18n.description} 91 91 </Text> ··· 173 173 interacted && t.atoms.bg_contrast_50, 174 174 ]}> 175 175 <View style={[a.flex_1, a.gap_xs]}> 176 - <Text 177 - style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 176 + <Text style={[a.text_md, a.font_bold, t.atoms.text_contrast_medium]}> 178 177 {title} 179 178 </Text> 180 179 <Text style={[a.leading_tight, {maxWidth: 400}]}>{description}</Text>
+1 -1
src/components/ReportDialog/SubmitView.tsx
··· 125 125 t.atoms.border_contrast_low, 126 126 ]}> 127 127 <View style={[a.flex_1, a.gap_xs]}> 128 - <Text style={[a.text_md, a.font_semi_bold]}> 128 + <Text style={[a.text_md, a.font_bold]}> 129 129 {selectedReportOption.title} 130 130 </Text> 131 131 <Text style={[a.leading_tight, {maxWidth: 400}]}>
+1 -7
src/components/SearchError.tsx
··· 36 36 {maxWidth: gtMobile ? 394 : 294}, 37 37 gtMobile ? a.gap_md : a.gap_sm, 38 38 ]}> 39 - <Text 40 - style={[ 41 - a.font_semi_bold, 42 - a.text_lg, 43 - a.text_center, 44 - a.leading_snug, 45 - ]}> 39 + <Text style={[a.font_bold, a.text_lg, a.text_center, a.leading_snug]}> 46 40 {title} 47 41 </Text> 48 42 {children}
+1 -1
src/components/Select/index.tsx
··· 280 280 // eslint-disable-next-line bsky-internal/avoid-unwrapped-text 281 281 return ( 282 282 <View style={[a.flex_1, a.py_md, a.border_b, t.atoms.border_contrast_low]}> 283 - <Text style={[a.text_md, selected && a.font_semi_bold]}>{children}</Text> 283 + <Text style={[a.text_md, selected && a.font_bold]}>{children}</Text> 284 284 </View> 285 285 ) 286 286 }
+1 -1
src/components/Select/index.web.tsx
··· 259 259 a.text_sm, 260 260 {outline: 0}, 261 261 (hovered || focused) && {backgroundColor: t.palette.primary_50}, 262 - selected && [a.font_semi_bold], 262 + selected && [a.font_bold], 263 263 a.transition_color, 264 264 style, 265 265 ])}>
+1 -1
src/components/StarterPack/ProfileStarterPacks.tsx
··· 255 255 {marginTop: a.border.borderWidth}, 256 256 ]}> 257 257 <View style={[a.gap_xs]}> 258 - <Text style={[a.font_semi_bold, a.text_lg, {color: 'white'}]}> 258 + <Text style={[a.font_bold, a.text_lg, {color: 'white'}]}> 259 259 <Trans>You haven't created a starter pack yet!</Trans> 260 260 </Text> 261 261 <Text style={[a.text_md, {color: 'white'}]}>
+3 -8
src/components/StarterPack/QrCode.tsx
··· 54 54 ]}> 55 55 <View style={[a.gap_sm]}> 56 56 <Text 57 - style={[ 58 - a.font_semi_bold, 59 - a.text_3xl, 60 - a.text_center, 61 - {color: 'white'}, 62 - ]}> 57 + style={[a.font_bold, a.text_3xl, a.text_center, {color: 'white'}]}> 63 58 {record.name} 64 59 </Text> 65 60 </View> 66 61 <View style={[a.gap_xl, a.align_center]}> 67 62 <Text 68 63 style={[ 69 - a.font_semi_bold, 64 + a.font_bold, 70 65 a.text_center, 71 66 {color: 'white', fontSize: 18}, 72 67 ]}> ··· 81 76 a.flex, 82 77 a.flex_row, 83 78 a.align_center, 84 - a.font_semi_bold, 79 + a.font_bold, 85 80 {color: 'white', fontSize: 18, gap: 6}, 86 81 ]}> 87 82 <Trans>
+1 -1
src/components/StarterPack/ShareDialog.tsx
··· 77 77 ) : ( 78 78 <View style={[!gtMobile && a.gap_lg]}> 79 79 <View style={[a.gap_sm, gtMobile && a.pb_lg]}> 80 - <Text style={[a.font_semi_bold, a.text_2xl]}> 80 + <Text style={[a.font_bold, a.text_2xl]}> 81 81 <Trans>Invite people to this starter pack!</Trans> 82 82 </Text> 83 83 <Text style={[a.text_md, t.atoms.text_contrast_medium]}>
+2 -2
src/components/StarterPack/StarterPackCard.tsx
··· 77 77 <View style={[a.flex_1]}> 78 78 <Text 79 79 emoji 80 - style={[a.text_md, a.font_semi_bold, a.leading_snug]} 80 + style={[a.text_md, a.font_bold, a.leading_snug]} 81 81 numberOfLines={2}> 82 82 {record.name} 83 83 </Text> ··· 97 97 </Text> 98 98 ) : null} 99 99 {!!joinedAllTimeCount && joinedAllTimeCount >= 50 && ( 100 - <Text style={[a.font_semi_bold, t.atoms.text_contrast_medium]}> 100 + <Text style={[a.font_bold, t.atoms.text_contrast_medium]}> 101 101 <Trans comment="Number of users (always at least 50) who have joined Bluesky using a specific starter pack"> 102 102 <Plural value={joinedAllTimeCount} other="# users have" /> joined! 103 103 </Trans>
+1 -1
src/components/StarterPack/Wizard/WizardEditListDialog.tsx
··· 105 105 : [a.pb_sm, a.align_end], 106 106 ]}> 107 107 <View style={{width: 60}} /> 108 - <Text style={[a.font_semi_bold, a.text_xl]}> 108 + <Text style={[a.font_bold, a.text_xl]}> 109 109 {state.currentStep === 'Profiles' ? ( 110 110 <Trans>Edit People</Trans> 111 111 ) : (
+1 -1
src/components/StarterPack/Wizard/WizardListCard.tsx
··· 83 83 emoji 84 84 style={[ 85 85 a.flex_1, 86 - a.font_semi_bold, 86 + a.font_bold, 87 87 a.text_md, 88 88 a.leading_tight, 89 89 a.self_start,
+1 -1
src/components/SubtleWebHover.web.tsx
··· 11 11 if (isTouchDevice) { 12 12 return null 13 13 } 14 - let opacity = 0.5 14 + let opacity: number 15 15 switch (t.name) { 16 16 case 'dark': 17 17 opacity = 0.4
+1 -1
src/components/TrendingTopics.tsx
··· 90 90 91 91 <Text 92 92 style={[ 93 - a.font_semi_bold, 93 + a.font_bold, 94 94 a.leading_tight, 95 95 isSmall ? [a.text_sm] : [a.text_md, {paddingBottom: 1}], 96 96 ]}
+3 -9
src/components/VideoPostCard.tsx
··· 227 227 {likeCount > 0 && ( 228 228 <View style={[a.flex_row, a.align_center, a.gap_xs]}> 229 229 <Heart size="sm" fill="white" /> 230 - <Text 231 - style={[a.text_sm, a.font_semi_bold, {color: 'white'}]}> 230 + <Text style={[a.text_sm, a.font_bold, {color: 'white'}]}> 232 231 {formatCount(i18n, likeCount)} 233 232 </Text> 234 233 </View> ··· 236 235 {repostCount > 0 && ( 237 236 <View style={[a.flex_row, a.align_center, a.gap_xs]}> 238 237 <Repost size="sm" fill="white" /> 239 - <Text 240 - style={[a.text_sm, a.font_semi_bold, {color: 'white'}]}> 238 + <Text style={[a.text_sm, a.font_bold, {color: 'white'}]}> 241 239 {formatCount(i18n, repostCount)} 242 240 </Text> 243 241 </View> ··· 522 520 <View style={[a.flex_row, a.align_center, a.gap_xs]}> 523 521 <Heart size="sm" fill="white" /> 524 522 <Text 525 - style={[ 526 - a.text_sm, 527 - a.font_semi_bold, 528 - {color: 'white'}, 529 - ]}> 523 + style={[a.text_sm, a.font_bold, {color: 'white'}]}> 530 524 {formatCount(i18n, likeCount)} 531 525 </Text> 532 526 </View>
+2 -2
src/components/WelcomeModal.tsx
··· 108 108 <Text 109 109 style={[ 110 110 a.text_2xl, 111 - a.font_semi_bold, 111 + a.font_bold, 112 112 a.user_select_none, 113 113 {color: '#354358', letterSpacing: -0.5}, 114 114 ]}> ··· 127 127 <Text 128 128 style={[ 129 129 gtMobile ? a.text_4xl : a.text_3xl, 130 - a.font_semi_bold, 130 + a.font_bold, 131 131 a.text_center, 132 132 {color: '#354358'}, 133 133 web({
+1 -1
src/components/WhoCanReply.tsx
··· 188 188 label={_(msg`Dialog: adjust who can interact with this post`)} 189 189 style={web({maxWidth: 400})}> 190 190 <View style={[a.gap_sm]}> 191 - <Text style={[a.font_semi_bold, a.text_xl, a.pb_sm]}> 191 + <Text style={[a.font_bold, a.text_xl, a.pb_sm]}> 192 192 <Trans>Who can interact with this post?</Trans> 193 193 </Text> 194 194 <Rules
+1 -1
src/components/activity-notifications/SubscribeProfileDialog.tsx
··· 219 219 label={_(msg`Get notified of new posts from ${name}`)}> 220 220 <View style={[a.gap_lg]}> 221 221 <View style={[a.gap_xs]}> 222 - <Text style={[a.font_bold, a.text_2xl]}> 222 + <Text style={[a.font_heavy, a.text_2xl]}> 223 223 <Trans>Keep me posted</Trans> 224 224 </Text> 225 225 <Text style={[t.atoms.text_contrast_medium, a.text_md]}>
+2 -2
src/components/ageAssurance/AgeAssuranceAdmonition.tsx
··· 82 82 </View> 83 83 <View style={[a.flex_1, a.gap_xs, a.pr_4xl]}> 84 84 <Text style={[a.text_sm, a.leading_snug]}>{children}</Text> 85 - <Text style={[a.text_sm, a.leading_snug, a.font_semi_bold]}> 85 + <Text style={[a.text_sm, a.leading_snug, a.font_bold]}> 86 86 <Trans> 87 87 Learn more in your{' '} 88 88 <InlineLinkText 89 89 label={_(msg`Go to account settings`)} 90 90 to={'/settings/account'} 91 - style={[a.text_sm, a.leading_snug, a.font_semi_bold]} 91 + style={[a.text_sm, a.leading_snug, a.font_bold]} 92 92 onPress={() => { 93 93 logger.metric('ageAssurance:navigateToSettings', {}) 94 94 }}>
+1 -1
src/components/ageAssurance/AgeAssuranceAppealDialog.tsx
··· 89 89 <AgeAssuranceBadge /> 90 90 </View> 91 91 92 - <Text style={[a.text_2xl, a.font_bold, a.pt_md, a.leading_tight]}> 92 + <Text style={[a.text_2xl, a.font_heavy, a.pt_md, a.leading_tight]}> 93 93 <Trans>Contact us</Trans> 94 94 </Text> 95 95
+1 -1
src/components/ageAssurance/AgeAssuranceBadge.tsx
··· 29 29 <Shield size="sm" /> 30 30 <Text 31 31 style={[ 32 - a.font_semi_bold, 32 + a.font_bold, 33 33 a.leading_snug, 34 34 { 35 35 color: select(t.name, {
+1 -1
src/components/ageAssurance/AgeAssuranceInitDialog.tsx
··· 178 178 <View style={[a.align_start]}> 179 179 <AgeAssuranceBadge /> 180 180 181 - <Text style={[a.text_xl, a.font_bold, a.pt_xl, a.pb_md]}> 181 + <Text style={[a.text_xl, a.font_heavy, a.pt_xl, a.pb_md]}> 182 182 {success ? <Trans>Success!</Trans> : <Trans>Verify your age</Trans>} 183 183 </Text> 184 184
+2 -2
src/components/ageAssurance/AgeAssuranceRedirectDialog.tsx
··· 160 160 a.pb_md, 161 161 ]}> 162 162 <SuccessIcon size="sm" fill={t.palette.positive_600} /> 163 - <Text style={[a.text_xl, a.font_bold]}> 163 + <Text style={[a.text_xl, a.font_heavy]}> 164 164 <Trans>Success</Trans> 165 165 </Text> 166 166 </View> ··· 209 209 ]}> 210 210 {error && <ErrorIcon size="md" fill={t.palette.negative_500} />} 211 211 212 - <Text style={[a.text_xl, a.font_bold]}> 212 + <Text style={[a.text_xl, a.font_heavy]}> 213 213 {error ? <Trans>Connection issue</Trans> : <Trans>Verifying</Trans>} 214 214 </Text> 215 215
+1 -1
src/components/ageAssurance/AgeRestrictedScreen.tsx
··· 62 62 </View> 63 63 64 64 <View style={[a.gap_sm, a.pb_lg]}> 65 - <Text style={[a.text_xl, a.leading_snug, a.font_bold]}> 65 + <Text style={[a.text_xl, a.leading_snug, a.font_heavy]}> 66 66 <Trans> 67 67 You must complete age assurance in order to access this screen. 68 68 </Trans>
+1 -1
src/components/dialogs/BirthDateSettings.tsx
··· 38 38 label={_(msg`My Birthday`)} 39 39 style={web({maxWidth: 400})}> 40 40 <View style={[a.gap_sm]}> 41 - <Text style={[a.text_xl, a.font_semi_bold]}> 41 + <Text style={[a.text_xl, a.font_bold]}> 42 42 <Trans>My Birthday</Trans> 43 43 </Text> 44 44 <Text style={[a.leading_snug, t.atoms.text_contrast_medium]}>
+1 -1
src/components/dialogs/DeviceLocationRequestDialog.tsx
··· 108 108 109 109 return ( 110 110 <View style={[a.gap_md]}> 111 - <Text style={[a.text_xl, a.font_bold]}> 111 + <Text style={[a.text_xl, a.font_heavy]}> 112 112 <Trans>Confirm your location</Trans> 113 113 </Text> 114 114 <View style={[a.gap_sm, a.pb_xs]}>
+3 -3
src/components/dialogs/EmailDialog/screens/Manage2FA/Disable.tsx
··· 153 153 154 154 return ( 155 155 <View style={[a.gap_sm]}> 156 - <Text style={[a.text_xl, a.font_bold, a.leading_snug]}> 156 + <Text style={[a.text_xl, a.font_heavy, a.leading_snug]}> 157 157 <Trans>Disable email 2FA</Trans> 158 158 </Text> 159 159 ··· 163 163 style={[a.text_sm, a.leading_snug, t.atoms.text_contrast_medium]}> 164 164 <Trans> 165 165 To disable your email 2FA method, please verify your access to{' '} 166 - <Span style={[a.font_semi_bold]}>{currentAccount?.email}</Span> 166 + <Span style={[a.font_bold]}>{currentAccount?.email}</Span> 167 167 </Trans> 168 168 </Text> 169 169 ··· 214 214 style={[a.text_sm, a.leading_snug, t.atoms.text_contrast_medium]}> 215 215 <Trans> 216 216 To disable your email 2FA method, please verify your access to{' '} 217 - <Span style={[a.font_semi_bold]}>{currentAccount?.email}</Span> 217 + <Span style={[a.font_bold]}>{currentAccount?.email}</Span> 218 218 </Trans> 219 219 </Text> 220 220
+1 -1
src/components/dialogs/EmailDialog/screens/Manage2FA/Enable.tsx
··· 88 88 return ( 89 89 <View style={[a.gap_lg]}> 90 90 <View style={[a.gap_sm]}> 91 - <Text style={[a.text_xl, a.font_bold, a.leading_snug]}> 91 + <Text style={[a.text_xl, a.font_heavy, a.leading_snug]}> 92 92 <Trans>Enable email 2FA</Trans> 93 93 </Text> 94 94
+3 -3
src/components/dialogs/EmailDialog/screens/Update.tsx
··· 199 199 200 200 return ( 201 201 <View style={[a.gap_lg]}> 202 - <Text style={[a.text_xl, a.font_bold]}> 202 + <Text style={[a.text_xl, a.font_heavy]}> 203 203 <Trans>Update your email</Trans> 204 204 </Text> 205 205 ··· 239 239 <> 240 240 <Divider /> 241 241 <View> 242 - <Text style={[a.text_md, a.pb_sm, a.font_semi_bold]}> 242 + <Text style={[a.text_md, a.pb_sm, a.font_bold]}> 243 243 <Trans>Security step required</Trans> 244 244 </Text> 245 245 <Text ··· 282 282 <View style={[a.gap_sm]}> 283 283 <View style={[a.flex_row, a.gap_sm, a.align_center]}> 284 284 <Check fill={t.palette.positive_600} size="xs" /> 285 - <Text style={[a.text_md, a.font_bold]}> 285 + <Text style={[a.text_md, a.font_heavy]}> 286 286 <Trans>Success!</Trans> 287 287 </Text> 288 288 </View>
+1 -1
src/components/dialogs/EmailDialog/screens/VerificationReminder.tsx
··· 58 58 <View style={[a.mb_xs, {height: 150 - dialogPadding}]} /> 59 59 60 60 <View style={[a.gap_sm]}> 61 - <Text style={[a.text_xl, a.font_bold]}> 61 + <Text style={[a.text_xl, a.font_heavy]}> 62 62 <Trans>Please verify your email</Trans> 63 63 </Text> 64 64 <Text style={[a.text_sm, a.leading_snug, t.atoms.text_contrast_medium]}>
+5 -5
src/components/dialogs/EmailDialog/screens/Verify.tsx
··· 174 174 return ( 175 175 <View style={[a.gap_lg]}> 176 176 <View style={[a.gap_sm]}> 177 - <Text style={[a.text_xl, a.font_bold]}> 177 + <Text style={[a.text_xl, a.font_heavy]}> 178 178 <Span style={{top: 1}}> 179 179 <Check size="sm" fill={t.palette.positive_600} /> 180 180 </Span> ··· 197 197 return ( 198 198 <View style={[a.gap_lg]}> 199 199 <View style={[a.gap_sm]}> 200 - <Text style={[a.text_xl, a.font_bold]}> 200 + <Text style={[a.text_xl, a.font_heavy]}> 201 201 {state.step === 'email' ? ( 202 202 state.mutationStatus === 'success' ? ( 203 203 <> ··· 239 239 state.mutationStatus === 'success' ? ( 240 240 <Trans> 241 241 We sent an email to{' '} 242 - <Span style={[a.font_semi_bold, t.atoms.text]}> 242 + <Span style={[a.font_bold, t.atoms.text]}> 243 243 {currentAccount!.email} 244 244 </Span>{' '} 245 245 containing a link. Please click on it to complete the email ··· 248 248 ) : ( 249 249 <Trans> 250 250 We'll send an email to{' '} 251 - <Span style={[a.font_semi_bold, t.atoms.text]}> 251 + <Span style={[a.font_bold, t.atoms.text]}> 252 252 {currentAccount!.email} 253 253 </Span>{' '} 254 254 containing a link. Please click on it to complete the email ··· 258 258 ) : ( 259 259 <Trans> 260 260 Please enter the code we sent to{' '} 261 - <Span style={[a.font_semi_bold, t.atoms.text]}> 261 + <Span style={[a.font_bold, t.atoms.text]}> 262 262 {currentAccount!.email} 263 263 </Span>{' '} 264 264 below.
+2 -2
src/components/dialogs/Embed.tsx
··· 104 104 <Dialog.Inner label={_(msg`Embed post`)} style={[{maxWidth: 500}]}> 105 105 <View style={[a.gap_lg]}> 106 106 <View style={[a.gap_sm]}> 107 - <Text style={[a.text_2xl, a.font_bold]}> 107 + <Text style={[a.text_2xl, a.font_heavy]}> 108 108 <Trans>Embed post</Trans> 109 109 </Text> 110 110 <Text ··· 147 147 148 148 {showCustomisation && ( 149 149 <View style={[a.gap_sm, a.p_md]}> 150 - <Text style={[t.atoms.text_contrast_medium, a.font_semi_bold]}> 150 + <Text style={[t.atoms.text_contrast_medium, a.font_bold]}> 151 151 <Trans>Color theme</Trans> 152 152 </Text> 153 153 <ToggleButton.Group
+1 -1
src/components/dialogs/EmbedConsent.tsx
··· 54 54 label={_(msg`External Media`)} 55 55 style={[gtMobile ? {width: 'auto', maxWidth: 400} : a.w_full]}> 56 56 <View style={a.gap_sm}> 57 - <Text style={[a.text_2xl, a.font_semi_bold]}> 57 + <Text style={[a.text_2xl, a.font_bold]}> 58 58 <Trans>External Media</Trans> 59 59 </Text> 60 60
+1 -1
src/components/dialogs/InAppBrowserConsent.tsx
··· 62 62 <Dialog.ScrollableInner label={_(msg`How should we open this link?`)}> 63 63 <View style={[a.gap_2xl]}> 64 64 <View style={[a.gap_sm]}> 65 - <Text style={[a.font_bold, a.text_2xl]}> 65 + <Text style={[a.font_heavy, a.text_2xl]}> 66 66 <Trans>How should we open this link?</Trans> 67 67 </Text> 68 68 <Text style={[t.atoms.text_contrast_high, a.leading_snug, a.text_md]}>
+2 -3
src/components/dialogs/LinkWarning.tsx
··· 68 68 }> 69 69 <View style={[a.gap_2xl]}> 70 70 <View style={[a.gap_sm]}> 71 - <Text style={[a.font_bold, a.text_2xl]}> 71 + <Text style={[a.font_heavy, a.text_2xl]}> 72 72 {potentiallyMisleading ? ( 73 73 <Trans>Potentially misleading link</Trans> 74 74 ) : ( ··· 151 151 ]}> 152 152 <Text style={[a.text_md, a.leading_snug, t.atoms.text_contrast_medium]}> 153 153 {scheme} 154 - <Text 155 - style={[a.text_md, a.leading_snug, t.atoms.text, a.font_semi_bold]}> 154 + <Text style={[a.text_md, a.leading_snug, t.atoms.text, a.font_bold]}> 156 155 {hostname} 157 156 </Text> 158 157 {rest}
+8 -15
src/components/dialogs/MutedWords.tsx
··· 108 108 <Dialog.ScrollableInner label={_(msg`Manage your muted words and tags`)}> 109 109 <View> 110 110 <Text 111 - style={[ 112 - a.text_md, 113 - a.font_semi_bold, 114 - a.pb_sm, 115 - t.atoms.text_contrast_high, 116 - ]}> 111 + style={[a.text_md, a.font_bold, a.pb_sm, t.atoms.text_contrast_high]}> 117 112 <Trans>Add muted words and tags</Trans> 118 113 </Text> 119 114 <Text style={[a.pb_lg, a.leading_snug, t.atoms.text_contrast_medium]}> ··· 152 147 style={[ 153 148 a.pb_xs, 154 149 a.text_sm, 155 - a.font_semi_bold, 150 + a.font_bold, 156 151 t.atoms.text_contrast_medium, 157 152 ]}> 158 153 <Trans>Duration:</Trans> ··· 252 247 style={[ 253 248 a.pb_xs, 254 249 a.text_sm, 255 - a.font_semi_bold, 250 + a.font_bold, 256 251 t.atoms.text_contrast_medium, 257 252 ]}> 258 253 <Trans>Mute in:</Trans> ··· 298 293 style={[ 299 294 a.pb_xs, 300 295 a.text_sm, 301 - a.font_semi_bold, 296 + a.font_bold, 302 297 t.atoms.text_contrast_medium, 303 298 ]}> 304 299 <Trans>Options:</Trans> ··· 367 362 <Text 368 363 style={[ 369 364 a.text_md, 370 - a.font_semi_bold, 365 + a.font_bold, 371 366 a.pb_md, 372 367 t.atoms.text_contrast_high, 373 368 ]}> ··· 460 455 style={[ 461 456 a.flex_1, 462 457 a.leading_snug, 463 - a.font_semi_bold, 458 + a.font_bold, 464 459 web({ 465 460 overflowWrap: 'break-word', 466 461 wordBreak: 'break-word', ··· 471 466 {word.value}{' '} 472 467 <Text style={[a.font_normal, t.atoms.text_contrast_medium]}> 473 468 in{' '} 474 - <Text 475 - style={[a.font_semi_bold, t.atoms.text_contrast_medium]}> 469 + <Text style={[a.font_bold, t.atoms.text_contrast_medium]}> 476 470 text & tags 477 471 </Text> 478 472 </Text> ··· 482 476 {word.value}{' '} 483 477 <Text style={[a.font_normal, t.atoms.text_contrast_medium]}> 484 478 in{' '} 485 - <Text 486 - style={[a.font_semi_bold, t.atoms.text_contrast_medium]}> 479 + <Text style={[a.font_bold, t.atoms.text_contrast_medium]}> 487 480 tags 488 481 </Text> 489 482 </Text>
+5 -7
src/components/dialogs/PostInteractionSettingsDialog.tsx
··· 84 84 ]}> 85 85 <Trans> 86 86 You can set default interaction settings in{' '} 87 - <Text style={[a.font_semi_bold, t.atoms.text_contrast_medium]}> 87 + <Text style={[a.font_bold, t.atoms.text_contrast_medium]}> 88 88 Settings &rarr; Moderation &rarr; Interaction settings 89 89 </Text> 90 90 . ··· 100 100 export function Header() { 101 101 return ( 102 102 <View style={[a.gap_md, a.pb_sm]}> 103 - <Text style={[a.text_2xl, a.font_semi_bold]}> 103 + <Text style={[a.text_2xl, a.font_bold]}> 104 104 <Trans>Post interaction settings</Trans> 105 105 </Text> 106 106 <Text style={[a.text_md, a.pb_xs]}> ··· 329 329 <View style={[a.flex_1, a.gap_md]}> 330 330 <View style={[a.gap_lg]}> 331 331 <View style={[a.gap_sm]}> 332 - <Text style={[a.font_semi_bold, a.text_lg]}> 332 + <Text style={[a.font_bold, a.text_lg]}> 333 333 <Trans>Quote settings</Trans> 334 334 </Text> 335 335 ··· 385 385 opacity: replySettingsDisabled ? 0.3 : 1, 386 386 }, 387 387 ]}> 388 - <Text style={[a.font_semi_bold, a.text_lg]}> 388 + <Text style={[a.font_bold, a.text_lg]}> 389 389 <Trans>Reply settings</Trans> 390 390 </Text> 391 391 ··· 535 535 }, 536 536 style, 537 537 ]}> 538 - <Text style={[a.text_sm, isSelected && a.font_semi_bold]}> 539 - {label} 540 - </Text> 538 + <Text style={[a.text_sm, isSelected && a.font_bold]}>{label}</Text> 541 539 {isSelected ? ( 542 540 <Check size="sm" fill={t.palette.primary_500} /> 543 541 ) : (
+1 -1
src/components/dialogs/SearchablePeopleList.tsx
··· 284 284 style={[ 285 285 a.z_10, 286 286 a.text_lg, 287 - a.font_bold, 287 + a.font_heavy, 288 288 a.leading_tight, 289 289 t.atoms.text_contrast_high, 290 290 ]}>
+3 -3
src/components/dialogs/StarterPackDialog.tsx
··· 172 172 isWeb ? a.mb_2xl : a.my_lg, 173 173 a.align_center, 174 174 ]}> 175 - <Text style={[a.text_lg, a.font_semi_bold]}> 175 + <Text style={[a.text_lg, a.font_bold]}> 176 176 <Trans>Add to starter packs</Trans> 177 177 </Text> 178 178 <Button ··· 189 189 <> 190 190 <View 191 191 style={[a.flex_row, a.justify_between, a.align_center, a.py_md]}> 192 - <Text style={[a.text_md, a.font_semi_bold]}> 192 + <Text style={[a.text_md, a.font_bold]}> 193 193 <Trans>New starter pack</Trans> 194 194 </Text> 195 195 <Button ··· 331 331 return ( 332 332 <View style={[a.flex_row, a.justify_between, a.align_center, a.py_md]}> 333 333 <View> 334 - <Text emoji style={[a.text_md, a.font_semi_bold]} numberOfLines={1}> 334 + <Text emoji style={[a.text_md, a.font_bold]} numberOfLines={1}> 335 335 {record.name} 336 336 </Text> 337 337
+1 -1
src/components/dialogs/SwitchAccount.tsx
··· 45 45 <Dialog.Handle /> 46 46 <Dialog.ScrollableInner label={_(msg`Switch Account`)}> 47 47 <View style={[a.gap_lg]}> 48 - <Text style={[a.text_2xl, a.font_semi_bold]}> 48 + <Text style={[a.text_2xl, a.font_bold]}> 49 49 <Trans>Switch Account</Trans> 50 50 </Text> 51 51
+2 -2
src/components/dialogs/nuxs/ActivitySubscriptions.tsx
··· 66 66 <SparkleIcon fill={t.palette.primary_800} size="sm" /> 67 67 <Text 68 68 style={[ 69 - a.font_semi_bold, 69 + a.font_bold, 70 70 { 71 71 color: t.palette.primary_800, 72 72 }, ··· 127 127 style={[ 128 128 a.text_3xl, 129 129 a.leading_tight, 130 - a.font_bold, 130 + a.font_heavy, 131 131 a.text_center, 132 132 { 133 133 fontSize: isWeb ? 28 : 32,
+2 -2
src/components/dialogs/nuxs/BookmarksAnnouncement.tsx
··· 65 65 <SparkleIcon fill={t.palette.primary_800} size="sm" /> 66 66 <Text 67 67 style={[ 68 - a.font_semi_bold, 68 + a.font_bold, 69 69 { 70 70 color: t.palette.primary_800, 71 71 }, ··· 133 133 style={[ 134 134 a.text_3xl, 135 135 a.leading_tight, 136 - a.font_bold, 136 + a.font_heavy, 137 137 a.text_center, 138 138 { 139 139 fontSize: isWeb ? 28 : 32,
+4 -4
src/components/dialogs/nuxs/InitialVerificationAnnouncement.tsx
··· 55 55 <SparkleIcon fill={t.palette.primary_700} size="sm" /> 56 56 <Text 57 57 style={[ 58 - a.font_semi_bold, 58 + a.font_bold, 59 59 { 60 60 color: t.palette.primary_700, 61 61 }, ··· 87 87 </View> 88 88 89 89 <View style={[a.gap_xs]}> 90 - <Text style={[a.text_2xl, a.font_semi_bold, a.leading_snug]}> 90 + <Text style={[a.text_2xl, a.font_bold, a.leading_snug]}> 91 91 <Trans>A new form of verification</Trans> 92 92 </Text> 93 93 <Text style={[a.leading_snug, a.text_md]}> ··· 123 123 <View style={[a.gap_sm]}> 124 124 <View style={[a.flex_row, a.align_center, a.gap_xs]}> 125 125 <VerifierCheck width={14} /> 126 - <Text style={[a.text_lg, a.font_semi_bold, a.leading_snug]}> 126 + <Text style={[a.text_lg, a.font_bold, a.leading_snug]}> 127 127 <Trans>Who can verify?</Trans> 128 128 </Text> 129 129 </View> ··· 138 138 <Trans> 139 139 Trust emerges from relationships, communities, and shared 140 140 context, so we’re also enabling{' '} 141 - <Span style={[a.font_semi_bold]}>trusted verifiers</Span>: 141 + <Span style={[a.font_bold]}>trusted verifiers</Span>: 142 142 organizations that can directly issue verification. 143 143 </Trans> 144 144 </Text>
+1 -3
src/components/dms/ChatEmptyPill.tsx
··· 89 89 onPress={onPress} 90 90 onPressIn={onPressIn} 91 91 onPressOut={onPressOut}> 92 - <Text 93 - style={[a.font_semi_bold, a.pointer_events_none]} 94 - selectable={false}> 92 + <Text style={[a.font_bold, a.pointer_events_none]} selectable={false}> 95 93 {prompts[promptIndex]} 96 94 </Text> 97 95 </AnimatedPressable>
+1 -2
src/components/dms/DateDivider.tsx
··· 67 67 a.px_md, 68 68 ]}> 69 69 <Trans> 70 - <Text 71 - style={[a.text_xs, t.atoms.text_contrast_medium, a.font_semi_bold]}> 70 + <Text style={[a.text_xs, t.atoms.text_contrast_medium, a.font_bold]}> 72 71 {date} 73 72 </Text>{' '} 74 73 at {time}
+1 -1
src/components/dms/EmojiPopup.android.tsx
··· 51 51 a.border_b, 52 52 t.atoms.border_contrast_low, 53 53 ]}> 54 - <Text style={[a.font_semi_bold, a.text_md]}> 54 + <Text style={[a.font_bold, a.text_md]}> 55 55 <Trans>Add Reaction</Trans> 56 56 </Text> 57 57 <Button
+1 -1
src/components/dms/MessagesListBlockedFooter.tsx
··· 61 61 return ( 62 62 <View style={[hasMessages && a.pt_md, a.pb_xl, a.gap_lg]}> 63 63 <Divider /> 64 - <Text style={[a.text_md, a.font_semi_bold, a.text_center]}> 64 + <Text style={[a.text_md, a.font_bold, a.text_center]}> 65 65 {isBlocking ? ( 66 66 <Trans>You have blocked this user</Trans> 67 67 ) : (
+1 -1
src/components/dms/MessagesListHeader.tsx
··· 154 154 emoji 155 155 style={[ 156 156 a.text_md, 157 - a.font_semi_bold, 157 + a.font_bold, 158 158 a.self_start, 159 159 web(a.leading_normal), 160 160 ]}
+1 -1
src/components/dms/NewMessagesPill.tsx
··· 88 88 onPress={onPress} 89 89 onPressIn={onPressIn} 90 90 onPressOut={onPressOut}> 91 - <Text style={[a.font_semi_bold]}> 91 + <Text style={[a.font_bold]}> 92 92 <Trans>New messages</Trans> 93 93 </Text> 94 94 </AnimatedPressable>
+4 -5
src/components/dms/ReportDialog.tsx
··· 200 200 </Button> 201 201 202 202 <View style={[a.justify_center, gtMobile ? a.gap_sm : a.gap_xs]}> 203 - <Text style={[a.text_2xl, a.font_semi_bold]}>{copy.title}</Text> 203 + <Text style={[a.text_2xl, a.font_bold]}>{copy.title}</Text> 204 204 <Text style={[a.text_md, t.atoms.text_contrast_medium]}> 205 205 <Trans> 206 206 Your report will be sent to the Bluesky Moderation Service ··· 213 213 )} 214 214 215 215 <Text style={[a.text_md, t.atoms.text_contrast_medium]}> 216 - <Text 217 - style={[a.font_semi_bold, a.text_md, t.atoms.text_contrast_medium]}> 216 + <Text style={[a.font_bold, a.text_md, t.atoms.text_contrast_medium]}> 218 217 <Trans>Reason:</Trans> 219 218 </Text>{' '} 220 - <Text style={[a.font_semi_bold, a.text_md]}>{reportOption.title}</Text> 219 + <Text style={[a.font_bold, a.text_md]}>{reportOption.title}</Text> 221 220 </Text> 222 221 223 222 <Divider /> ··· 347 346 return ( 348 347 <View style={a.gap_2xl}> 349 348 <View style={[a.justify_center, gtMobile ? a.gap_sm : a.gap_xs]}> 350 - <Text style={[a.text_2xl, a.font_semi_bold]}> 349 + <Text style={[a.text_2xl, a.font_bold]}> 351 350 <Trans>Report submitted</Trans> 352 351 </Text> 353 352 <Text style={[a.text_md, t.atoms.text_contrast_medium]}>
+1 -2
src/components/forms/FormError.tsx
··· 20 20 ]}> 21 21 <Warning fill={t.palette.white} size="md" /> 22 22 <View style={[a.flex_1]}> 23 - <Text 24 - style={[{color: t.palette.white}, a.font_semi_bold, a.leading_snug]}> 23 + <Text style={[{color: t.palette.white}, a.font_bold, a.leading_snug]}> 25 24 {error} 26 25 </Text> 27 26 </View>
+9 -19
src/components/forms/TextField.tsx
··· 15 15 android, 16 16 applyFonts, 17 17 atoms as a, 18 + ios, 18 19 platform, 19 20 type TextStyleProp, 20 21 tokens, ··· 201 202 a.px_xs, 202 203 { 203 204 // paddingVertical doesn't work w/multiline - esb 204 - lineHeight: a.text_md.fontSize * 1.2, 205 + lineHeight: a.text_md.fontSize * 1.1875, 205 206 textAlignVertical: rest.multiline ? 'top' : undefined, 206 207 minHeight: rest.multiline ? 80 : undefined, 207 208 minWidth: 0, 208 - paddingTop: 13, 209 - paddingBottom: 13, 210 209 }, 211 - android({ 212 - paddingTop: 8, 213 - paddingBottom: 9, 214 - }), 215 - /* 216 - * Margins are needed here to avoid autofill background overlapping the 217 - * top and bottom borders - esb 218 - */ 210 + ios({paddingTop: 12, paddingBottom: 13}), 211 + // Needs to be sm on Paper, md on Fabric for some godforsaken reason -sfn 212 + android(a.py_sm), 213 + // fix for autofill styles covering border 219 214 web({ 220 - paddingTop: 11, 215 + paddingTop: 10, 221 216 paddingBottom: 11, 222 217 marginTop: 2, 223 218 marginBottom: 2, ··· 267 262 a.absolute, 268 263 a.inset_0, 269 264 a.rounded_sm, 270 - t.atoms.bg_contrast_50, 265 + t.atoms.bg_contrast_25, 271 266 {borderColor: 'transparent', borderWidth: 2}, 272 267 ctx.hovered ? chromeHover : {}, 273 268 ctx.focused ? chromeFocus : {}, ··· 292 287 return ( 293 288 <Text 294 289 nativeID={nativeID} 295 - style={[ 296 - a.text_sm, 297 - a.font_semi_bold, 298 - t.atoms.text_contrast_medium, 299 - a.mb_sm, 300 - ]}> 290 + style={[a.text_sm, a.font_bold, t.atoms.text_contrast_medium, a.mb_sm]}> 301 291 {children} 302 292 </Text> 303 293 )
+1 -1
src/components/forms/Toggle.tsx
··· 249 249 return ( 250 250 <Text 251 251 style={[ 252 - a.font_semi_bold, 252 + a.font_bold, 253 253 a.leading_tight, 254 254 { 255 255 userSelect: 'none',
+1 -1
src/components/forms/ToggleButton.tsx
··· 133 133 <Text 134 134 style={[ 135 135 a.text_center, 136 - a.font_semi_bold, 136 + a.font_bold, 137 137 t.atoms.text_contrast_medium, 138 138 textStyles, 139 139 ]}>
+4 -4
src/components/intents/VerifyEmailIntentDialog.tsx
··· 75 75 </View> 76 76 ) : status === 'success' ? ( 77 77 <View style={[a.gap_sm, isNative && a.pb_xl]}> 78 - <Text style={[a.font_bold, a.text_2xl]}> 78 + <Text style={[a.font_heavy, a.text_2xl]}> 79 79 <Trans>Email Verified</Trans> 80 80 </Text> 81 81 <Text style={[a.text_md, a.leading_snug]}> ··· 87 87 </View> 88 88 ) : status === 'failure' ? ( 89 89 <View style={[a.gap_sm]}> 90 - <Text style={[a.font_bold, a.text_2xl]}> 90 + <Text style={[a.font_heavy, a.text_2xl]}> 91 91 <Trans>Invalid Verification Code</Trans> 92 92 </Text> 93 93 <Text style={[a.text_md, a.leading_snug]}> ··· 100 100 </View> 101 101 ) : ( 102 102 <View style={[a.gap_sm, isNative && a.pb_xl]}> 103 - <Text style={[a.font_bold, a.text_2xl]}> 103 + <Text style={[a.font_heavy, a.text_2xl]}> 104 104 <Trans>Email Resent</Trans> 105 105 </Text> 106 106 <Text style={[a.text_md, a.leading_snug]}> 107 107 <Trans> 108 108 We have sent another verification email to{' '} 109 - <Text style={[a.text_md, a.font_semi_bold]}> 109 + <Text style={[a.text_md, a.font_bold]}> 110 110 {currentAccount?.email} 111 111 </Text> 112 112 .
+2 -2
src/components/interstitials/Trending.tsx
··· 82 82 style={[ 83 83 t.atoms.text_contrast_medium, 84 84 a.text_sm, 85 - a.font_semi_bold, 85 + a.font_bold, 86 86 ]}> 87 87 {' '} 88 88 </Text> ··· 101 101 style={[ 102 102 t.atoms.text, 103 103 a.text_sm, 104 - a.font_semi_bold, 104 + a.font_bold, 105 105 {opacity: 0.7}, // NOTE: we use opacity 0.7 instead of a color to match the color of the home pager tab bar 106 106 ]}> 107 107 {topic.topic}
+1 -1
src/components/interstitials/TrendingVideos.tsx
··· 82 82 a.align_center, 83 83 a.justify_between, 84 84 ]}> 85 - <Text style={[a.text_sm, a.font_semi_bold, a.leading_snug]}> 85 + <Text style={[a.text_sm, a.font_bold, a.leading_snug]}> 86 86 <Trans>Trending Videos</Trans> 87 87 </Text> 88 88 <Button
+2 -2
src/components/live/EditLiveDialog.tsx
··· 120 120 style={web({maxWidth: 420})}> 121 121 <View style={[a.gap_lg]}> 122 122 <View style={[a.gap_sm]}> 123 - <Text style={[a.font_semi_bold, a.text_2xl]}> 123 + <Text style={[a.font_bold, a.text_2xl]}> 124 124 <Trans>You are Live</Trans> 125 125 </Text> 126 126 <View style={[a.flex_row, a.align_center, a.gap_xs]}> ··· 182 182 a.text_sm, 183 183 a.leading_snug, 184 184 a.flex_1, 185 - a.font_semi_bold, 185 + a.font_bold, 186 186 {color: t.palette.negative_500}, 187 187 ]}> 188 188 {liveLinkError ? (
+2 -2
src/components/live/GoLiveDialog.tsx
··· 94 94 style={web({maxWidth: 420})}> 95 95 <View style={[a.gap_xl]}> 96 96 <View style={[a.gap_sm]}> 97 - <Text style={[a.font_semi_bold, a.text_2xl]}> 97 + <Text style={[a.font_bold, a.text_2xl]}> 98 98 <Trans>Go Live</Trans> 99 99 </Text> 100 100 <Text style={[a.text_md, a.leading_snug, t.atoms.text_contrast_high]}> ··· 153 153 a.text_sm, 154 154 a.leading_snug, 155 155 a.flex_1, 156 - a.font_semi_bold, 156 + a.font_bold, 157 157 {color: t.palette.negative_500}, 158 158 ]}> 159 159 {liveLinkError ? (
+1 -1
src/components/live/LinkPreview.tsx
··· 70 70 <> 71 71 <Text 72 72 numberOfLines={2} 73 - style={[a.leading_snug, a.font_semi_bold, a.text_md]}> 73 + style={[a.leading_snug, a.font_bold, a.text_md]}> 74 74 {linkMeta.title || linkMeta.url} 75 75 </Text> 76 76 <View style={[a.flex_row, a.align_center, a.gap_2xs]}>
+1 -1
src/components/live/LiveIndicator.tsx
··· 39 39 <Text 40 40 style={[ 41 41 a.text_center, 42 - a.font_semi_bold, 42 + a.font_bold, 43 43 fontSize, 44 44 {color: t.palette.white}, 45 45 ]}>
+1 -1
src/components/live/LiveStatusDialog.tsx
··· 137 137 <View style={[a.w_full, a.justify_center, a.gap_2xs]}> 138 138 <Text 139 139 numberOfLines={3} 140 - style={[a.leading_snug, a.font_semi_bold, a.text_xl]}> 140 + style={[a.leading_snug, a.font_bold, a.text_xl]}> 141 141 {embed.external.title || embed.external.uri} 142 142 </Text> 143 143 <View style={[a.flex_row, a.align_center, a.gap_2xs]}>
+4 -4
src/components/moderation/ContentHider.tsx
··· 178 178 style={[ 179 179 a.flex_1, 180 180 a.text_left, 181 - a.font_semi_bold, 181 + a.font_bold, 182 182 a.leading_snug, 183 - gtMobile && [a.font_semi_bold], 183 + gtMobile && [a.font_bold], 184 184 t.atoms.text_contrast_medium, 185 185 web({ 186 186 marginBottom: 1, ··· 192 192 {!modui.noOverride && ( 193 193 <Text 194 194 style={[ 195 - a.font_semi_bold, 195 + a.font_bold, 196 196 a.leading_snug, 197 - gtMobile && [a.font_semi_bold], 197 + gtMobile && [a.font_bold], 198 198 t.atoms.text_contrast_high, 199 199 web({ 200 200 marginBottom: 1,
+3 -8
src/components/moderation/LabelPreference.tsx
··· 48 48 49 49 return ( 50 50 <View style={[a.gap_xs, a.flex_1]}> 51 - <Text emoji style={[a.font_semi_bold, gtPhone ? a.text_sm : a.text_md]}> 51 + <Text emoji style={[a.font_bold, gtPhone ? a.text_sm : a.text_md]}> 52 52 {name} 53 53 </Text> 54 54 <Text emoji style={[t.atoms.text_contrast_medium, a.leading_snug]}> ··· 241 241 <View style={[a.flex_row, a.gap_xs, a.align_center, a.mt_xs]}> 242 242 <CircleInfo size="sm" fill={t.atoms.text_contrast_high.color} /> 243 243 244 - <Text 245 - style={[ 246 - t.atoms.text_contrast_medium, 247 - a.font_semi_bold, 248 - a.italic, 249 - ]}> 244 + <Text style={[t.atoms.text_contrast_medium, a.font_bold, a.italic]}> 250 245 {adultDisabled ? ( 251 246 <Trans>Adult content is disabled.</Trans> 252 247 ) : isGlobalLabel ? ( ··· 279 274 t.atoms.border_contrast_low, 280 275 a.self_start, 281 276 ]}> 282 - <Text emoji style={[a.font_semi_bold, t.atoms.text_contrast_low]}> 277 + <Text emoji style={[a.font_bold, t.atoms.text_contrast_low]}> 283 278 {currentPrefLabel} 284 279 </Text> 285 280 </View>
+3 -3
src/components/moderation/LabelsOnMeDialog.tsx
··· 67 67 /> 68 68 ) : ( 69 69 <> 70 - <Text style={[a.text_2xl, a.font_bold, a.pb_xs, a.leading_tight]}> 70 + <Text style={[a.text_2xl, a.font_heavy, a.pb_xs, a.leading_tight]}> 71 71 {isAccount ? ( 72 72 <Trans>Labels on your account</Trans> 73 73 ) : ( ··· 134 134 ]}> 135 135 <View style={[a.p_md, a.gap_sm, a.flex_row]}> 136 136 <View style={[a.flex_1, a.gap_xs]}> 137 - <Text emoji style={[a.font_semi_bold, a.text_md]}> 137 + <Text emoji style={[a.font_bold, a.text_md]}> 138 138 {strings.name} 139 139 </Text> 140 140 <Text emoji style={[t.atoms.text_contrast_medium, a.leading_snug]}> ··· 264 264 return ( 265 265 <> 266 266 <View> 267 - <Text style={[a.text_2xl, a.font_semi_bold, a.pb_xs, a.leading_tight]}> 267 + <Text style={[a.text_2xl, a.font_bold, a.pb_xs, a.leading_tight]}> 268 268 <Trans>Appeal "{strings.name}" label</Trans> 269 269 </Text> 270 270 <Text style={[a.text_md, a.leading_snug]}>
+1 -1
src/components/moderation/ModerationDetailsDialog.tsx
··· 142 142 paddingBottom: 0, 143 143 }}> 144 144 <View style={[xGutters, a.pb_lg]}> 145 - <Text emoji style={[t.atoms.text, a.text_2xl, a.font_bold, a.mb_sm]}> 145 + <Text emoji style={[t.atoms.text, a.text_2xl, a.font_heavy, a.mb_sm]}> 146 146 {name} 147 147 </Text> 148 148 <Text style={[t.atoms.text, a.text_sm, a.leading_snug]}>
+6 -6
src/components/moderation/ReportDialog/index.tsx
··· 69 69 const {_} = useLingui() 70 70 return ( 71 71 <Dialog.ScrollableInner label={_(msg`Report dialog`)}> 72 - <Text style={[a.font_bold, a.text_xl, a.leading_snug, a.pb_xs]}> 72 + <Text style={[a.font_heavy, a.text_xl, a.leading_snug, a.pb_xs]}> 73 73 <Trans>Invalid report subject</Trans> 74 74 </Text> 75 75 <Text style={[a.text_md, a.leading_snug]}> ··· 393 393 <Text style={[a.leading_snug, a.pb_xs]}> 394 394 <Trans> 395 395 Your report will be sent to{' '} 396 - <Text style={[a.font_semi_bold, a.leading_snug]}> 396 + <Text style={[a.font_bold, a.leading_snug]}> 397 397 {state.selectedLabeler?.creator.displayName} 398 398 </Text> 399 399 . ··· 529 529 ) : ( 530 530 <Text 531 531 style={[ 532 - a.font_bold, 532 + a.font_heavy, 533 533 a.text_center, 534 534 t.atoms.text, 535 535 { ··· 552 552 <Text 553 553 style={[ 554 554 a.flex_1, 555 - a.font_bold, 555 + a.font_heavy, 556 556 a.text_lg, 557 557 a.leading_snug, 558 558 active ? t.atoms.text : t.atoms.text_contrast_medium, ··· 598 598 ? [t.atoms.border_contrast_high] 599 599 : [t.atoms.border_contrast_low], 600 600 ]}> 601 - <Text style={[a.text_md, a.font_semi_bold, a.leading_snug]}> 601 + <Text style={[a.text_md, a.font_bold, a.leading_snug]}> 602 602 {option.title} 603 603 </Text> 604 604 <Text ··· 670 670 avatar={labeler.creator.avatar} 671 671 /> 672 672 <View style={[a.flex_1]}> 673 - <Text style={[a.text_md, a.font_semi_bold, a.leading_snug]}> 673 + <Text style={[a.text_md, a.font_bold, a.leading_snug]}> 674 674 {title} 675 675 </Text> 676 676 <Text
+2 -8
src/components/moderation/ScreenHider.tsx
··· 86 86 </View> 87 87 </View> 88 88 <Text 89 - style={[ 90 - a.text_4xl, 91 - a.font_semi_bold, 92 - a.text_center, 93 - a.mb_md, 94 - t.atoms.text, 95 - ]}> 89 + style={[a.text_4xl, a.font_bold, a.text_center, a.mb_md, t.atoms.text]}> 96 90 {isNoPwi ? ( 97 91 <Trans>Sign-in Required</Trans> 98 92 ) : ( ··· 118 112 <Text 119 113 style={[ 120 114 a.text_lg, 121 - a.font_semi_bold, 115 + a.font_bold, 122 116 a.leading_snug, 123 117 t.atoms.text, 124 118 a.ml_xs,
+2 -2
src/components/verification/VerificationsDialog.tsx
··· 79 79 gtMobile ? {width: 'auto', maxWidth: 400, minWidth: 200} : a.w_full, 80 80 ]}> 81 81 <View style={[a.gap_sm, a.pb_lg]}> 82 - <Text style={[a.text_2xl, a.font_semi_bold, a.pr_4xl, a.leading_tight]}> 82 + <Text style={[a.text_2xl, a.font_bold, a.pr_4xl, a.leading_tight]}> 83 83 {label} 84 84 </Text> 85 85 <Text style={[a.text_md, a.leading_snug]}> ··· 206 206 <ProfileCard.AvatarPlaceholder /> 207 207 <View style={[a.flex_1]}> 208 208 <Text 209 - style={[a.text_md, a.font_semi_bold, a.leading_snug]} 209 + style={[a.text_md, a.font_bold, a.leading_snug]} 210 210 numberOfLines={1}> 211 211 <Trans>Unknown verifier</Trans> 212 212 </Text>
+1 -2
src/components/verification/VerifierDialog.tsx
··· 89 89 </View> 90 90 91 91 <View style={[a.gap_sm]}> 92 - <Text 93 - style={[a.text_2xl, a.font_semi_bold, a.pr_4xl, a.leading_tight]}> 92 + <Text style={[a.text_2xl, a.font_bold, a.pr_4xl, a.leading_tight]}> 94 93 {label} 95 94 </Text> 96 95 <Text style={[a.text_md, a.leading_snug]}>
+1 -1
src/lib/ThemeContext.tsx
··· 1 1 import {type ReactNode} from 'react' 2 2 import {createContext, useContext} from 'react' 3 3 import {type TextStyle, type ViewStyle} from 'react-native' 4 - import {type ThemeName} from '@bsky.app/alf' 5 4 5 + import {type ThemeName} from '#/alf/types' 6 6 import {darkTheme, defaultTheme, dimTheme} from './themes' 7 7 8 8 export type ColorScheme = 'light' | 'dark'
+27 -27
src/lib/themes.ts
··· 101 101 '2xl-medium': { 102 102 fontSize: 18, 103 103 letterSpacing: tokens.TRACKING, 104 - fontWeight: fontWeight.semiBold, 104 + fontWeight: fontWeight.bold, 105 105 }, 106 106 '2xl-bold': { 107 107 fontSize: 18, 108 108 letterSpacing: tokens.TRACKING, 109 - fontWeight: fontWeight.semiBold, 109 + fontWeight: fontWeight.bold, 110 110 }, 111 111 '2xl-heavy': { 112 112 fontSize: 18, 113 113 letterSpacing: tokens.TRACKING, 114 - fontWeight: fontWeight.bold, 114 + fontWeight: fontWeight.heavy, 115 115 }, 116 116 'xl-thin': { 117 117 fontSize: 17, ··· 126 126 'xl-medium': { 127 127 fontSize: 17, 128 128 letterSpacing: tokens.TRACKING, 129 - fontWeight: fontWeight.semiBold, 129 + fontWeight: fontWeight.bold, 130 130 }, 131 131 'xl-bold': { 132 132 fontSize: 17, 133 133 letterSpacing: tokens.TRACKING, 134 - fontWeight: fontWeight.semiBold, 134 + fontWeight: fontWeight.bold, 135 135 }, 136 136 'xl-heavy': { 137 137 fontSize: 17, 138 138 letterSpacing: tokens.TRACKING, 139 - fontWeight: fontWeight.bold, 139 + fontWeight: fontWeight.heavy, 140 140 }, 141 141 'lg-thin': { 142 142 fontSize: 16, ··· 151 151 'lg-medium': { 152 152 fontSize: 16, 153 153 letterSpacing: tokens.TRACKING, 154 - fontWeight: fontWeight.semiBold, 154 + fontWeight: fontWeight.bold, 155 155 }, 156 156 'lg-bold': { 157 157 fontSize: 16, 158 158 letterSpacing: tokens.TRACKING, 159 - fontWeight: fontWeight.semiBold, 159 + fontWeight: fontWeight.bold, 160 160 }, 161 161 'lg-heavy': { 162 162 fontSize: 16, 163 163 letterSpacing: tokens.TRACKING, 164 - fontWeight: fontWeight.bold, 164 + fontWeight: fontWeight.heavy, 165 165 }, 166 166 'md-thin': { 167 167 fontSize: 15, ··· 176 176 'md-medium': { 177 177 fontSize: 15, 178 178 letterSpacing: tokens.TRACKING, 179 - fontWeight: fontWeight.semiBold, 179 + fontWeight: fontWeight.bold, 180 180 }, 181 181 'md-bold': { 182 182 fontSize: 15, 183 183 letterSpacing: tokens.TRACKING, 184 - fontWeight: fontWeight.semiBold, 184 + fontWeight: fontWeight.bold, 185 185 }, 186 186 'md-heavy': { 187 187 fontSize: 15, 188 188 letterSpacing: tokens.TRACKING, 189 - fontWeight: fontWeight.bold, 189 + fontWeight: fontWeight.heavy, 190 190 }, 191 191 'sm-thin': { 192 192 fontSize: 14, ··· 201 201 'sm-medium': { 202 202 fontSize: 14, 203 203 letterSpacing: tokens.TRACKING, 204 - fontWeight: fontWeight.semiBold, 204 + fontWeight: fontWeight.bold, 205 205 }, 206 206 'sm-bold': { 207 207 fontSize: 14, 208 208 letterSpacing: tokens.TRACKING, 209 - fontWeight: fontWeight.semiBold, 209 + fontWeight: fontWeight.bold, 210 210 }, 211 211 'sm-heavy': { 212 212 fontSize: 14, 213 213 letterSpacing: tokens.TRACKING, 214 - fontWeight: fontWeight.bold, 214 + fontWeight: fontWeight.heavy, 215 215 }, 216 216 'xs-thin': { 217 217 fontSize: 13, ··· 226 226 'xs-medium': { 227 227 fontSize: 13, 228 228 letterSpacing: tokens.TRACKING, 229 - fontWeight: fontWeight.semiBold, 229 + fontWeight: fontWeight.bold, 230 230 }, 231 231 'xs-bold': { 232 232 fontSize: 13, 233 233 letterSpacing: tokens.TRACKING, 234 - fontWeight: fontWeight.semiBold, 234 + fontWeight: fontWeight.bold, 235 235 }, 236 236 'xs-heavy': { 237 237 fontSize: 13, 238 238 letterSpacing: tokens.TRACKING, 239 - fontWeight: fontWeight.bold, 239 + fontWeight: fontWeight.heavy, 240 240 }, 241 241 242 242 'title-2xl': { 243 243 fontSize: 34, 244 244 letterSpacing: tokens.TRACKING, 245 - fontWeight: fontWeight.semiBold, 245 + fontWeight: fontWeight.bold, 246 246 }, 247 247 'title-xl': { 248 248 fontSize: 28, 249 249 letterSpacing: tokens.TRACKING, 250 - fontWeight: fontWeight.semiBold, 250 + fontWeight: fontWeight.bold, 251 251 }, 252 252 'title-lg': { 253 253 fontSize: 22, 254 - fontWeight: fontWeight.semiBold, 254 + fontWeight: fontWeight.bold, 255 255 }, 256 256 title: { 257 - fontWeight: fontWeight.semiBold, 257 + fontWeight: fontWeight.bold, 258 258 fontSize: 20, 259 259 letterSpacing: tokens.TRACKING, 260 260 }, 261 261 'title-sm': { 262 - fontWeight: fontWeight.semiBold, 262 + fontWeight: fontWeight.bold, 263 263 fontSize: 17, 264 264 letterSpacing: tokens.TRACKING, 265 265 }, ··· 274 274 fontWeight: fontWeight.normal, 275 275 }, 276 276 'button-lg': { 277 - fontWeight: fontWeight.semiBold, 277 + fontWeight: fontWeight.bold, 278 278 fontSize: 18, 279 279 letterSpacing: tokens.TRACKING, 280 280 }, 281 281 button: { 282 - fontWeight: fontWeight.semiBold, 282 + fontWeight: fontWeight.bold, 283 283 fontSize: 14, 284 284 letterSpacing: tokens.TRACKING, 285 285 }, ··· 296 296 palette: { 297 297 ...defaultTheme.palette, 298 298 default: { 299 - background: darkPalette.contrast_0, 299 + background: darkPalette.black, 300 300 backgroundLight: darkPalette.contrast_25, 301 301 text: darkPalette.white, 302 302 textLight: darkPalette.contrast_600, ··· 345 345 ...darkTheme.palette, 346 346 default: { 347 347 ...darkTheme.palette.default, 348 - background: dimPalette.contrast_0, 348 + background: dimPalette.black, 349 349 backgroundLight: dimPalette.contrast_25, 350 350 text: dimPalette.white, 351 351 textLight: dimPalette.contrast_700,
+1 -1
src/screens/Home/NoFeedsPinned.tsx
··· 75 75 }, 76 76 ]}> 77 77 <View style={[a.align_center, a.gap_sm, a.pb_xl]}> 78 - <Text style={[a.text_xl, a.font_semi_bold]}> 78 + <Text style={[a.text_xl, a.font_bold]}> 79 79 <Trans>Whoops!</Trans> 80 80 </Text> 81 81 <Text
+2 -2
src/screens/List/ListHiddenScreen.tsx
··· 122 122 width={42} 123 123 /> 124 124 <View style={[a.gap_sm, a.align_center]}> 125 - <Text style={[a.font_semi_bold, a.text_3xl]}> 125 + <Text style={[a.font_bold, a.text_3xl]}> 126 126 {list.creator.viewer?.blocking || list.creator.viewer?.blockedBy ? ( 127 127 <Trans>Creator has been blocked</Trans> 128 128 ) : ( ··· 150 150 ) : ( 151 151 <Trans> 152 152 This list – created by{' '} 153 - <Text style={[a.font_semi_bold]}> 153 + <Text style={[a.font_bold]}> 154 154 {sanitizeHandle(list.creator.handle, '@')} 155 155 </Text>{' '} 156 156 – contains possible violations of Bluesky's community guidelines
+1 -1
src/screens/Login/FormContainer.tsx
··· 22 22 testID={testID} 23 23 style={[a.gap_md, a.flex_1, !gtMobile && [a.px_lg, a.py_md], style]}> 24 24 {titleText && !gtMobile && ( 25 - <Text style={[a.text_xl, a.font_semi_bold, t.atoms.text_contrast_high]}> 25 + <Text style={[a.text_xl, a.font_bold, t.atoms.text_contrast_high]}> 26 26 {titleText} 27 27 </Text> 28 28 )}
+1 -1
src/screens/Login/PasswordUpdatedForm.tsx
··· 19 19 <FormContainer 20 20 testID="passwordUpdatedForm" 21 21 style={[a.gap_2xl, !gtMobile && a.mt_5xl]}> 22 - <Text style={[a.text_3xl, a.font_semi_bold, a.text_center]}> 22 + <Text style={[a.text_3xl, a.font_bold, a.text_center]}> 23 23 <Trans>Password updated!</Trans> 24 24 </Text> 25 25 <Text style={[a.text_center, a.mx_auto, {maxWidth: '80%'}]}>
+2 -4
src/screens/Messages/ChatList.tsx
··· 265 265 width={48} 266 266 fill={t.atoms.text_contrast_low.color} 267 267 /> 268 - <Text 269 - style={[a.pt_md, a.pb_sm, a.text_2xl, a.font_semi_bold]}> 268 + <Text style={[a.pt_md, a.pb_sm, a.text_2xl, a.font_bold]}> 270 269 <Trans>Whoops!</Trans> 271 270 </Text> 272 271 <Text ··· 299 298 <> 300 299 <View style={[a.pt_3xl, a.align_center]}> 301 300 <MessageIcon width={48} fill={t.palette.primary_500} /> 302 - <Text 303 - style={[a.pt_md, a.pb_sm, a.text_2xl, a.font_semi_bold]}> 301 + <Text style={[a.pt_md, a.pb_sm, a.text_2xl, a.font_bold]}> 304 302 <Trans>Nothing here</Trans> 305 303 </Text> 306 304 <Text
+2 -4
src/screens/Messages/Inbox.tsx
··· 193 193 width={48} 194 194 fill={t.atoms.text_contrast_low.color} 195 195 /> 196 - <Text 197 - style={[a.pt_md, a.pb_sm, a.text_2xl, a.font_semi_bold]}> 196 + <Text style={[a.pt_md, a.pb_sm, a.text_2xl, a.font_bold]}> 198 197 <Trans>Whoops!</Trans> 199 198 </Text> 200 199 <Text ··· 226 225 <> 227 226 <View style={[a.pt_3xl, a.align_center]}> 228 227 <MessageIcon width={48} fill={t.palette.primary_500} /> 229 - <Text 230 - style={[a.pt_md, a.pb_sm, a.text_2xl, a.font_semi_bold]}> 228 + <Text style={[a.pt_md, a.pb_sm, a.text_2xl, a.font_bold]}> 231 229 <Trans comment="Title message shown in chat requests inbox when it's empty"> 232 230 Inbox zero! 233 231 </Trans>
+2 -2
src/screens/Messages/Settings.tsx
··· 71 71 </Layout.Header.Outer> 72 72 <Layout.Content> 73 73 <View style={[a.p_lg, a.gap_md]}> 74 - <Text style={[a.text_lg, a.font_semi_bold]}> 74 + <Text style={[a.text_lg, a.font_bold]}> 75 75 <Trans>Allow new messages from</Trans> 76 76 </Text> 77 77 <Toggle.Group ··· 121 121 {isNative && ( 122 122 <> 123 123 <Divider style={a.my_md} /> 124 - <Text style={[a.text_lg, a.font_semi_bold]}> 124 + <Text style={[a.text_lg, a.font_bold]}> 125 125 <Trans>Notification Sounds</Trans> 126 126 </Text> 127 127 <Toggle.Group
+2 -7
src/screens/Messages/components/ChatDisabled.tsx
··· 22 22 <View 23 23 style={[a.align_start, a.p_xl, a.rounded_md, t.atoms.bg_contrast_25]}> 24 24 <Text 25 - style={[ 26 - a.text_md, 27 - a.font_semi_bold, 28 - a.pb_sm, 29 - t.atoms.text_contrast_high, 30 - ]}> 25 + style={[a.text_md, a.font_bold, a.pb_sm, t.atoms.text_contrast_high]}> 31 26 <Trans>Your chats have been disabled</Trans> 32 27 </Text> 33 28 <Text style={[a.text_sm, a.leading_snug, t.atoms.text_contrast_medium]}> ··· 109 104 110 105 return ( 111 106 <Dialog.ScrollableInner label={_(msg`Appeal this decision`)}> 112 - <Text style={[a.text_2xl, a.font_semi_bold, a.pb_xs, a.leading_tight]}> 107 + <Text style={[a.text_2xl, a.font_bold, a.pb_xs, a.leading_tight]}> 113 108 <Trans>Appeal this decision</Trans> 114 109 </Text> 115 110 <Text style={[a.text_md, a.leading_snug]}>
+2 -2
src/screens/Messages/components/ChatListItem.tsx
··· 397 397 style={[ 398 398 a.text_md, 399 399 t.atoms.text, 400 - a.font_semi_bold, 400 + a.font_bold, 401 401 {lineHeight: 21}, 402 402 isDimStyle && t.atoms.text_contrast_medium, 403 403 ]}> ··· 461 461 style={[ 462 462 a.text_sm, 463 463 a.leading_snug, 464 - hasUnread ? a.font_semi_bold : t.atoms.text_contrast_high, 464 + hasUnread ? a.font_bold : t.atoms.text_contrast_high, 465 465 isDimStyle && t.atoms.text_contrast_medium, 466 466 ]}> 467 467 {lastMessage}
+1 -1
src/screens/Messages/components/InboxPreview.tsx
··· 57 57 )} 58 58 </View> 59 59 <ButtonText 60 - style={[a.flex_1, a.font_semi_bold, a.text_left]} 60 + style={[a.flex_1, a.font_bold, a.text_left]} 61 61 numberOfLines={1}> 62 62 <Trans>Chat requests</Trans> 63 63 </ButtonText>
+1 -1
src/screens/Messages/components/RequestListItem.tsx
··· 38 38 {/* spacer, since you can't nest pressables */} 39 39 <View style={[a.pt_md, a.pb_xs, a.w_full, {opacity: 0}]} aria-hidden> 40 40 {/* Placeholder text so that it responds to the font height */} 41 - <Text style={[a.text_xs, a.leading_tight, a.font_semi_bold]}> 41 + <Text style={[a.text_xs, a.leading_tight, a.font_bold]}> 42 42 <Trans comment="Accept a chat request">Accept Request</Trans> 43 43 </Text> 44 44 </View>
+6 -12
src/screens/Moderation/index.tsx
··· 142 142 ]}> 143 143 <View style={[a.flex_row, a.align_center, a.gap_md]}> 144 144 <Icon size="md" style={[t.atoms.text_contrast_medium]} /> 145 - <Text style={[a.text_sm, a.font_semi_bold]}>{title}</Text> 145 + <Text style={[a.text_sm, a.font_bold]}>{title}</Text> 146 146 </View> 147 147 <ChevronRight 148 148 size="sm" ··· 221 221 )} 222 222 223 223 <Text 224 - style={[ 225 - a.text_md, 226 - a.font_semi_bold, 227 - a.pb_md, 228 - t.atoms.text_contrast_high, 229 - ]}> 224 + style={[a.text_md, a.font_bold, a.pb_md, t.atoms.text_contrast_high]}> 230 225 <Trans>Moderation tools</Trans> 231 226 </Text> 232 227 ··· 335 330 a.pt_2xl, 336 331 a.pb_md, 337 332 a.text_md, 338 - a.font_semi_bold, 333 + a.font_bold, 339 334 t.atoms.text_contrast_high, 340 335 ]}> 341 336 <Trans>Content filters</Trans> ··· 369 364 a.pt_2xl, 370 365 a.pb_md, 371 366 a.text_md, 372 - a.font_semi_bold, 367 + a.font_bold, 373 368 t.atoms.text_contrast_high, 374 369 ]}> 375 370 <Trans>Content filters</Trans> ··· 401 396 a.justify_between, 402 397 disabledOnIOS && {opacity: 0.5}, 403 398 ]}> 404 - <Text 405 - style={[a.font_semi_bold, t.atoms.text_contrast_high]}> 399 + <Text style={[a.font_bold, t.atoms.text_contrast_high]}> 406 400 <Trans>Enable adult content</Trans> 407 401 </Text> 408 402 <Toggle.Item ··· 471 465 <Text 472 466 style={[ 473 467 a.text_md, 474 - a.font_semi_bold, 468 + a.font_bold, 475 469 a.pt_2xl, 476 470 a.pb_md, 477 471 t.atoms.text_contrast_high,
+5 -2
src/screens/Onboarding/Layout.tsx
··· 17 17 useTheme, 18 18 web, 19 19 } from '#/alf' 20 + import {leading} from '#/alf/typography' 20 21 import {Button, ButtonIcon, ButtonText} from '#/components/Button' 21 22 import {ArrowLeft_Stroke2_Corner0_Rounded as ArrowLeft} from '#/components/icons/Arrow' 22 23 import {HEADER_SLOT_SIZE} from '#/components/Layout' ··· 233 234 style={[ 234 235 a.pb_sm, 235 236 a.text_4xl, 236 - a.font_semi_bold, 237 - a.leading_tight, 237 + a.font_bold, 238 + { 239 + lineHeight: leading(a.text_4xl, a.leading_tight), 240 + }, 238 241 flatten(style), 239 242 ]}> 240 243 {children}
+4 -4
src/screens/Onboarding/StepFinished.tsx
··· 432 432 </View> 433 433 434 434 <View style={[a.gap_sm]}> 435 - <Text style={[a.font_bold, a.text_3xl, a.text_center]}> 435 + <Text style={[a.font_heavy, a.text_3xl, a.text_center]}> 436 436 {title} 437 437 </Text> 438 438 <Text ··· 537 537 <View style={[a.flex_row, a.align_center, a.w_full, a.gap_lg]}> 538 538 <IconCircle icon={Growth} size="lg" style={{width: 48, height: 48}} /> 539 539 <View style={[a.flex_1, a.gap_xs]}> 540 - <Text style={[a.font_semi_bold, a.text_lg]}> 540 + <Text style={[a.font_bold, a.text_lg]}> 541 541 <Trans>Public</Trans> 542 542 </Text> 543 543 <Text ··· 551 551 <View style={[a.flex_row, a.align_center, a.w_full, a.gap_lg]}> 552 552 <IconCircle icon={News} size="lg" style={{width: 48, height: 48}} /> 553 553 <View style={[a.flex_1, a.gap_xs]}> 554 - <Text style={[a.font_semi_bold, a.text_lg]}> 554 + <Text style={[a.font_bold, a.text_lg]}> 555 555 <Trans>Open</Trans> 556 556 </Text> 557 557 <Text ··· 567 567 style={{width: 48, height: 48}} 568 568 /> 569 569 <View style={[a.flex_1, a.gap_xs]}> 570 - <Text style={[a.font_semi_bold, a.text_lg]}> 570 + <Text style={[a.font_bold, a.text_lg]}> 571 571 <Trans>Flexible</Trans> 572 572 </Text> 573 573 <Text
+1 -1
src/screens/Onboarding/StepInterests/InterestButton.tsx
··· 69 69 { 70 70 color: t.palette.contrast_900, 71 71 }, 72 - a.font_semi_bold, 72 + a.font_bold, 73 73 native({paddingTop: 2}), 74 74 ctx.selected ? styles.textSelected : {}, 75 75 ]}>
+1 -1
src/screens/Onboarding/StepInterests/index.tsx
··· 184 184 <Text 185 185 style={[ 186 186 a.text_md, 187 - a.font_semi_bold, 187 + a.font_bold, 188 188 { 189 189 color: t.palette.negative_900, 190 190 },
+1 -1
src/screens/Onboarding/StepSuggestedAccounts/index.tsx
··· 133 133 134 134 return ( 135 135 <View style={[a.align_start]} testID="onboardingInterests"> 136 - <Text style={[a.font_bold, a.text_3xl]}> 136 + <Text style={[a.font_heavy, a.text_3xl]}> 137 137 <Trans comment="Accounts suggested to the user for them to follow"> 138 138 Suggested for you 139 139 </Trans>
+1 -6
src/screens/PostThread/components/ThreadError.tsx
··· 58 58 ]}> 59 59 <View style={[a.gap_xs]}> 60 60 <Text 61 - style={[ 62 - a.text_center, 63 - a.text_lg, 64 - a.font_semi_bold, 65 - a.leading_snug, 66 - ]}> 61 + style={[a.text_center, a.text_lg, a.font_bold, a.leading_snug]}> 67 62 {title} 68 63 </Text> 69 64 <Text
+10 -16
src/screens/PostThread/components/ThreadItemAnchor.tsx
··· 129 129 ]}> 130 130 <TrashIcon style={[t.atoms.text_contrast_medium]} /> 131 131 </View> 132 - <Text 133 - style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 132 + <Text style={[a.text_md, a.font_bold, t.atoms.text_contrast_medium]}> 134 133 <Trans>Post has been deleted</Trans> 135 134 </Text> 136 135 </View> ··· 344 343 style={[ 345 344 a.flex_shrink, 346 345 a.text_lg, 347 - a.font_semi_bold, 346 + a.font_bold, 348 347 a.leading_snug, 349 348 ]} 350 349 numberOfLines={1}> ··· 440 439 <Text 441 440 testID="repostCount-expanded" 442 441 style={[a.text_md, t.atoms.text_contrast_medium]}> 443 - <Text style={[a.text_md, a.font_semi_bold, t.atoms.text]}> 442 + <Text style={[a.text_md, a.font_bold, t.atoms.text]}> 444 443 {formatPostStatCount(post.repostCount)} 445 444 </Text>{' '} 446 445 <Plural ··· 458 457 <Text 459 458 testID="quoteCount-expanded" 460 459 style={[a.text_md, t.atoms.text_contrast_medium]}> 461 - <Text style={[a.text_md, a.font_semi_bold, t.atoms.text]}> 460 + <Text style={[a.text_md, a.font_bold, t.atoms.text]}> 462 461 {formatPostStatCount(post.quoteCount)} 463 462 </Text>{' '} 464 463 <Plural ··· 474 473 <Text 475 474 testID="likeCount-expanded" 476 475 style={[a.text_md, t.atoms.text_contrast_medium]}> 477 - <Text style={[a.text_md, a.font_semi_bold, t.atoms.text]}> 476 + <Text style={[a.text_md, a.font_bold, t.atoms.text]}> 478 477 {formatPostStatCount(post.likeCount)} 479 478 </Text>{' '} 480 479 <Plural value={post.likeCount} one="like" other="likes" /> ··· 485 484 <Text 486 485 testID="bookmarkCount-expanded" 487 486 style={[a.text_md, t.atoms.text_contrast_medium]}> 488 - <Text style={[a.text_md, a.font_semi_bold, t.atoms.text]}> 487 + <Text style={[a.text_md, a.font_bold, t.atoms.text]}> 489 488 {formatPostStatCount(post.bookmarkCount)} 490 489 </Text>{' '} 491 490 <Plural value={post.bookmarkCount} one="save" other="saves" /> ··· 653 652 <Text 654 653 style={[ 655 654 a.text_xs, 656 - a.font_semi_bold, 655 + a.font_bold, 657 656 a.leading_tight, 658 657 t.atoms.text_contrast_medium, 659 658 ]}> ··· 670 669 <Prompt.DescriptionText> 671 670 <Trans> 672 671 This post claims to have been created on{' '} 673 - <RNText style={[a.font_semi_bold]}> 674 - {niceDate(i18n, createdAt)} 675 - </RNText> 676 - , but was first seen by Bluesky on{' '} 677 - <RNText style={[a.font_semi_bold]}> 678 - {niceDate(i18n, indexedAt)} 679 - </RNText> 680 - . 672 + <RNText style={[a.font_bold]}>{niceDate(i18n, createdAt)}</RNText>, 673 + but was first seen by Bluesky on{' '} 674 + <RNText style={[a.font_bold]}>{niceDate(i18n, indexedAt)}</RNText>. 681 675 </Trans> 682 676 </Prompt.DescriptionText> 683 677 <Text
+1 -2
src/screens/PostThread/components/ThreadItemPost.tsx
··· 106 106 ]}> 107 107 <TrashIcon style={[t.atoms.text_contrast_medium]} /> 108 108 </View> 109 - <Text 110 - style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 109 + <Text style={[a.text_md, a.font_bold, t.atoms.text_contrast_medium]}> 111 110 <Trans>Post has been deleted</Trans> 112 111 </Text> 113 112 </View>
+1 -2
src/screens/PostThread/components/ThreadItemPostTombstone.tsx
··· 46 46 <View style={[a.flex_row, a.justify_center, {width: LINEAR_AVI_WIDTH}]}> 47 47 <Icon style={[t.atoms.text_contrast_medium]} /> 48 48 </View> 49 - <Text 50 - style={[a.text_md, a.font_semi_bold, t.atoms.text_contrast_medium]}> 49 + <Text style={[a.text_md, a.font_bold, t.atoms.text_contrast_medium]}> 51 50 {copy} 52 51 </Text> 53 52 </View>
+1 -1
src/screens/Profile/ErrorState.tsx
··· 27 27 <View style={[a.px_xl]}> 28 28 <CircleInfo width={48} style={[t.atoms.text_contrast_low]} /> 29 29 30 - <Text style={[a.text_xl, a.font_semi_bold, a.pb_md, a.pt_xl]}> 30 + <Text style={[a.text_xl, a.font_bold, a.pb_md, a.pt_xl]}> 31 31 <Trans>Hmmmm, we couldn't load that moderation service.</Trans> 32 32 </Text> 33 33 <Text
+1 -1
src/screens/Profile/Header/DisplayName.tsx
··· 26 26 t.atoms.text, 27 27 gtMobile ? a.text_4xl : a.text_3xl, 28 28 a.self_start, 29 - a.font_bold, 29 + a.font_heavy, 30 30 ]}> 31 31 {sanitizeDisplayName( 32 32 profile.displayName || sanitizeHandle(profile.handle),
+2 -2
src/screens/Profile/Header/EditProfileDialog.tsx
··· 326 326 style={[ 327 327 a.text_sm, 328 328 a.mt_xs, 329 - a.font_semi_bold, 329 + a.font_bold, 330 330 {color: t.palette.negative_400}, 331 331 ]}> 332 332 <Plural ··· 377 377 style={[ 378 378 a.text_sm, 379 379 a.mt_xs, 380 - a.font_semi_bold, 380 + a.font_bold, 381 381 {color: t.palette.negative_400}, 382 382 ]}> 383 383 <Plural
+3 -3
src/screens/Profile/Header/Metrics.tsx
··· 37 37 style={[a.flex_row, t.atoms.text]} 38 38 to={makeProfileLink(profile, 'followers')} 39 39 label={`${profile.followersCount || 0} ${pluralizedFollowers}`}> 40 - <Text style={[a.font_semi_bold, a.text_md]}>{followers} </Text> 40 + <Text style={[a.font_bold, a.text_md]}>{followers} </Text> 41 41 <Text style={[t.atoms.text_contrast_medium, a.text_md]}> 42 42 {pluralizedFollowers} 43 43 </Text> ··· 47 47 style={[a.flex_row, t.atoms.text]} 48 48 to={makeProfileLink(profile, 'follows')} 49 49 label={_(msg`${profile.followsCount || 0} following`)}> 50 - <Text style={[a.font_semi_bold, a.text_md]}>{following} </Text> 50 + <Text style={[a.font_bold, a.text_md]}>{following} </Text> 51 51 <Text style={[t.atoms.text_contrast_medium, a.text_md]}> 52 52 {pluralizedFollowings} 53 53 </Text> 54 54 </InlineLinkText> 55 - <Text style={[a.font_semi_bold, t.atoms.text, a.text_md]}> 55 + <Text style={[a.font_bold, t.atoms.text, a.text_md]}> 56 56 {formatCount(i18n, profile.postsCount || 0)}{' '} 57 57 <Text style={[t.atoms.text_contrast_medium, a.font_normal, a.text_md]}> 58 58 {plural(profile.postsCount || 0, {one: 'post', other: 'posts'})}
+2 -2
src/screens/Profile/Header/ProfileHeaderLabeler.tsx
··· 225 225 ? t.palette.contrast_700 226 226 : t.palette.white, 227 227 }, 228 - a.font_semi_bold, 228 + a.font_bold, 229 229 a.text_center, 230 230 a.leading_tight, 231 231 ]}> ··· 297 297 {({hovered, focused, pressed}) => ( 298 298 <Text 299 299 style={[ 300 - a.font_semi_bold, 300 + a.font_bold, 301 301 a.text_sm, 302 302 t.atoms.text_contrast_medium, 303 303 (hovered || focused || pressed) &&
+1 -1
src/screens/Profile/Header/ProfileHeaderStandard.tsx
··· 267 267 t.atoms.text, 268 268 gtMobile ? a.text_4xl : a.text_3xl, 269 269 a.self_start, 270 - a.font_bold, 270 + a.font_heavy, 271 271 a.leading_tight, 272 272 ]}> 273 273 {sanitizeDisplayName(
+2 -2
src/screens/Profile/components/ProfileFeedHeader.tsx
··· 234 234 <Text 235 235 style={[ 236 236 a.text_md, 237 - a.font_bold, 237 + a.font_heavy, 238 238 a.leading_tight, 239 239 gtMobile && a.text_lg, 240 240 ]} ··· 441 441 442 442 <View style={[a.flex_1, a.gap_2xs]}> 443 443 <Text 444 - style={[a.text_2xl, a.font_bold, a.leading_tight]} 444 + style={[a.text_2xl, a.font_heavy, a.leading_tight]} 445 445 numberOfLines={2}> 446 446 {info.displayName} 447 447 </Text>
+1 -1
src/screens/ProfileList/components/ErrorScreen.tsx
··· 22 22 23 23 return ( 24 24 <View style={[a.px_xl, a.py_md, a.gap_md]}> 25 - <Text style={[a.text_4xl, a.font_bold]}> 25 + <Text style={[a.text_4xl, a.font_heavy]}> 26 26 <Trans>Could not load list</Trans> 27 27 </Text> 28 28 <Text style={[a.text_md, t.atoms.text_contrast_high, a.leading_snug]}>
+1 -1
src/screens/Search/Explore.tsx
··· 885 885 ]}> 886 886 <CircleInfo size="md" fill={t.palette.negative_400} /> 887 887 <View style={[a.flex_1, a.gap_sm]}> 888 - <Text style={[a.font_semi_bold, a.leading_snug]}> 888 + <Text style={[a.font_bold, a.leading_snug]}> 889 889 {item.message} 890 890 </Text> 891 891 <Text
+1 -1
src/screens/Search/Shell.tsx
··· 460 460 a.pt_sm, 461 461 a.pb_lg, 462 462 ]}> 463 - <Text style={[a.text_2xl, a.font_bold]}> 463 + <Text style={[a.text_2xl, a.font_heavy]}> 464 464 <Trans>Search</Trans> 465 465 </Text> 466 466 </View>
+1 -5
src/screens/Search/components/ModuleHeader.tsx
··· 93 93 94 94 export function TitleText({style, ...props}: TextProps) { 95 95 return ( 96 - <Text 97 - style={[a.font_semi_bold, a.flex_1, a.text_xl, style]} 98 - emoji 99 - {...props} 100 - /> 96 + <Text style={[a.font_bold, a.flex_1, a.text_xl, style]} emoji {...props} /> 101 97 ) 102 98 } 103 99
+1 -1
src/screens/Search/components/SearchHistory.tsx
··· 45 45 <View style={[a.w_full, a.gap_md]}> 46 46 {(searchHistory.length > 0 || selectedProfiles.length > 0) && ( 47 47 <View style={[a.px_lg, a.pt_sm]}> 48 - <Text style={[a.text_md, a.font_semi_bold]}> 48 + <Text style={[a.text_md, a.font_bold]}> 49 49 <Trans>Recent Searches</Trans> 50 50 </Text> 51 51 </View>
+2 -2
src/screens/Search/components/StarterPackCard.tsx
··· 89 89 <View style={[a.flex_1]}> 90 90 <Text 91 91 emoji 92 - style={[a.text_md, a.font_semi_bold, a.leading_snug]} 92 + style={[a.text_md, a.font_bold, a.leading_snug]} 93 93 numberOfLines={1}> 94 94 {record.name} 95 95 </Text> ··· 242 242 <Text 243 243 style={[ 244 244 gtPhone ? a.text_md : a.text_xs, 245 - a.font_semi_bold, 245 + a.font_bold, 246 246 a.leading_snug, 247 247 {color: 'white'}, 248 248 ]}>
+1 -1
src/screens/Search/modules/ExploreInterestsCard.tsx
··· 63 63 ]}> 64 64 <View style={[a.flex_row, a.gap_sm, a.align_center]}> 65 65 <Shapes /> 66 - <Text style={[a.text_xl, a.font_semi_bold, a.leading_tight]}> 66 + <Text style={[a.text_xl, a.font_bold, a.leading_tight]}> 67 67 <Trans>Your interests</Trans> 68 68 </Text> 69 69 </View>
+1 -1
src/screens/Search/modules/ExploreRecommendations.tsx
··· 50 50 fill={t.palette.primary_500} 51 51 style={{marginLeft: -2}} 52 52 /> 53 - <Text style={[a.text_2xl, a.font_bold, t.atoms.text]}> 53 + <Text style={[a.text_2xl, a.font_heavy, t.atoms.text]}> 54 54 <Trans>Recommended</Trans> 55 55 </Text> 56 56 </View>
+2 -2
src/screens/Search/modules/ExploreTrendingTopics.tsx
··· 104 104 <Text 105 105 style={[ 106 106 a.text_md, 107 - a.font_semi_bold, 107 + a.font_bold, 108 108 a.leading_tight, 109 109 {width: 20}, 110 110 ]}> ··· 113 113 </Trans> 114 114 </Text> 115 115 <Text 116 - style={[a.text_md, a.font_semi_bold, a.leading_tight]} 116 + style={[a.text_md, a.font_bold, a.leading_tight]} 117 117 numberOfLines={1}> 118 118 {trend.displayName} 119 119 </Text>
+1 -1
src/screens/Settings/AccountSettings.tsx
··· 97 97 color={t.palette.primary_500} 98 98 /> 99 99 <SettingsList.ItemText 100 - style={[{color: t.palette.primary_500}, a.font_semi_bold]}> 100 + style={[{color: t.palette.primary_500}, a.font_bold]}> 101 101 <Trans>Verify your email</Trans> 102 102 </SettingsList.ItemText> 103 103 <SettingsList.Chevron color={t.palette.primary_500} />
+2 -7
src/screens/Settings/AppIconSettings/index.tsx
··· 93 93 a.text_md, 94 94 a.mt_xl, 95 95 a.mb_sm, 96 - a.font_semi_bold, 96 + a.font_bold, 97 97 t.atoms.text_contrast_medium, 98 98 ]}> 99 99 <Trans>Bluesky+</Trans> ··· 201 201 const t = useTheme() 202 202 return ( 203 203 <Text 204 - style={[ 205 - a.text_md, 206 - a.font_semi_bold, 207 - a.flex_1, 208 - t.atoms.text_contrast_medium, 209 - ]} 204 + style={[a.text_md, a.font_bold, a.flex_1, t.atoms.text_contrast_medium]} 210 205 emoji> 211 206 {children} 212 207 </Text>
+2 -5
src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx
··· 140 140 Enable notifications for an account by visiting their 141 141 profile and pressing the{' '} 142 142 <RNText 143 - style={[ 144 - a.font_semi_bold, 145 - t.atoms.text_contrast_high, 146 - ]}> 143 + style={[a.font_bold, t.atoms.text_contrast_high]}> 147 144 bell icon 148 145 </RNText>{' '} 149 146 <BellRingingFilledIcon ··· 160 157 <InlineLinkText 161 158 label={_(msg`Privacy and Security settings`)} 162 159 to={{screen: 'ActivityPrivacySettings'}} 163 - style={[a.font_semi_bold]}> 160 + style={[a.font_bold]}> 164 161 Settings &rarr; Privacy and Security 165 162 </InlineLinkText> 166 163 .
+1 -1
src/screens/Settings/NotificationSettings/components/ItemTextWithSubtitle.tsx
··· 19 19 const t = useTheme() 20 20 return ( 21 21 <View style={[a.flex_1, bold ? a.gap_xs : a.gap_2xs]}> 22 - <SettingsList.ItemText style={bold && [a.font_semi_bold, a.text_lg]}> 22 + <SettingsList.ItemText style={bold && [a.font_bold, a.text_lg]}> 23 23 {titleText} 24 24 </SettingsList.ItemText> 25 25 {showSkeleton ? (
+1 -1
src/screens/Settings/NotificationSettings/components/PreferenceControls.tsx
··· 150 150 {'include' in preference && ( 151 151 <> 152 152 <Divider /> 153 - <Text style={[a.font_semi_bold, a.text_md]}> 153 + <Text style={[a.font_bold, a.text_md]}> 154 154 <Trans>From</Trans> 155 155 </Text> 156 156 <Toggle.Group
+2 -2
src/screens/Settings/components/AddAppPasswordDialog.tsx
··· 107 107 style={[a.gap_lg]} 108 108 exiting={native(SlideOutLeft)} 109 109 key={0}> 110 - <Text style={[a.text_2xl, a.font_semi_bold]}> 110 + <Text style={[a.text_2xl, a.font_bold]}> 111 111 <Trans>Add App Password</Trans> 112 112 </Text> 113 113 <Text style={[a.text_md, a.leading_snug]}> ··· 183 183 style={[a.gap_lg]} 184 184 entering={isWeb ? FadeIn.delay(200) : SlideInRight} 185 185 key={1}> 186 - <Text style={[a.text_2xl, a.font_semi_bold]}> 186 + <Text style={[a.text_2xl, a.font_bold]}> 187 187 <Trans>Here is your app password!</Trans> 188 188 </Text> 189 189 <Text style={[a.text_md, a.leading_snug]}>
+3 -3
src/screens/Settings/components/ChangeHandleDialog.tsx
··· 244 244 <Text> 245 245 <Trans> 246 246 Your full handle will be{' '} 247 - <Text style={[a.font_semi_bold]}> 247 + <Text style={[a.font_bold]}> 248 248 @{createFullHandle(subdomain, host)} 249 249 </Text> 250 250 </Trans> ··· 280 280 }), 281 281 )} 282 282 to="https://bsky.social/about/blog/4-28-2023-domain-handle-tutorial" 283 - style={[a.font_semi_bold]} 283 + style={[a.font_bold]} 284 284 disableMismatchWarning> 285 285 Learn more here. 286 286 </InlineLinkText> ··· 522 522 <Admonition type="info" style={[a.mb_md]}> 523 523 <Trans> 524 524 Your current handle{' '} 525 - <Text style={[a.font_semi_bold]}> 525 + <Text style={[a.font_bold]}> 526 526 {sanitizeHandle(currentAccount?.handle || '', '@')} 527 527 </Text>{' '} 528 528 will automatically remain reserved for you. You can switch back to
+1 -1
src/screens/Settings/components/ChangePasswordDialog.tsx
··· 165 165 style={web({maxWidth: 400})}> 166 166 <View style={[a.gap_xl]}> 167 167 <View style={[a.gap_sm]}> 168 - <Text style={[a.font_bold, a.text_2xl]}> 168 + <Text style={[a.font_heavy, a.text_2xl]}> 169 169 {uiStrings[stage].title} 170 170 </Text> 171 171 {error ? (
+1 -1
src/screens/Settings/components/CopyButton.tsx
··· 58 58 pointerEvents="none"> 59 59 <Text 60 60 style={[ 61 - a.font_semi_bold, 61 + a.font_bold, 62 62 a.text_right, 63 63 a.text_md, 64 64 t.atoms.text_contrast_high,
+1 -1
src/screens/Settings/components/DisableEmail2FADialog.tsx
··· 85 85 <View style={[a.relative, a.gap_md, a.w_full]}> 86 86 <Text 87 87 nativeID="dialog-title" 88 - style={[a.text_2xl, a.font_semi_bold, t.atoms.text]}> 88 + style={[a.text_2xl, a.font_bold, t.atoms.text]}> 89 89 <Trans>Disable Email 2FA</Trans> 90 90 </Text> 91 91 <P nativeID="dialog-description">
+1 -1
src/screens/Settings/components/ExportCarDialog.tsx
··· 58 58 accessibilityDescribedBy="dialog-description" 59 59 accessibilityLabelledBy="dialog-title"> 60 60 <View style={[a.relative, a.gap_lg, a.w_full]}> 61 - <Text nativeID="dialog-title" style={[a.text_2xl, a.font_bold]}> 61 + <Text nativeID="dialog-title" style={[a.text_2xl, a.font_heavy]}> 62 62 <Trans>Export My Data</Trans> 63 63 </Text> 64 64 <Text
+3 -4
src/screens/Signup/index.tsx
··· 133 133 <Animated.View entering={!isFetchedAtMount ? FadeIn : undefined}> 134 134 <LinearGradientBackground 135 135 style={[a.mx_lg, a.p_lg, a.gap_sm, a.rounded_sm]}> 136 - <Text style={[a.font_semi_bold, a.text_xl, {color: 'white'}]}> 136 + <Text style={[a.font_bold, a.text_xl, {color: 'white'}]}> 137 137 {starterPack.record.name} 138 138 </Text> 139 139 <Text style={[{color: 'white'}]}> ··· 164 164 !gtMobile && {paddingBottom: 100}, 165 165 ]}> 166 166 <View style={[a.gap_sm, a.pb_3xl]}> 167 - <Text 168 - style={[a.font_semi_bold, t.atoms.text_contrast_medium]}> 167 + <Text style={[a.font_bold, t.atoms.text_contrast_medium]}> 169 168 <Trans> 170 169 Step {state.activeStep + 1} of{' '} 171 170 {state.serviceDescription && ··· 174 173 : '3'} 175 174 </Trans> 176 175 </Text> 177 - <Text style={[a.text_3xl, a.font_semi_bold]}> 176 + <Text style={[a.text_3xl, a.font_bold]}> 178 177 {state.activeStep === SignupStep.INFO ? ( 179 178 <Trans>Your account</Trans> 180 179 ) : state.activeStep === SignupStep.HANDLE ? (
+1 -1
src/view/com/auth/SplashScreen.tsx
··· 44 44 <Text 45 45 style={[ 46 46 a.text_md, 47 - a.font_semi_bold, 47 + a.font_bold, 48 48 t.atoms.text_contrast_medium, 49 49 a.text_center, 50 50 ]}>
+2 -1
src/view/com/util/images/AutoSizedImage.tsx
··· 185 185 }, 186 186 ], 187 187 ]}> 188 - <Text style={[a.font_bold, largeAlt ? a.text_xs : {fontSize: 8}]}> 188 + <Text 189 + style={[a.font_heavy, largeAlt ? a.text_xs : {fontSize: 8}]}> 189 190 ALT 190 191 </Text> 191 192 </View>
+2 -2
src/view/screens/Feeds.tsx
··· 709 709 <IconCircle icon={ListSparkle_Stroke2_Corner0_Rounded} size="lg" /> 710 710 <View style={[a.flex_1, a.gap_xs]}> 711 711 <Text style={[a.flex_1, a.text_2xl, a.font_heavy, t.atoms.text]}> 712 - <Trans>My Feeds </Trans> 712 + <Trans>My Feeds</Trans> 713 713 </Text> 714 714 <Text style={[t.atoms.text_contrast_high]}> 715 715 <Trans>All the feeds you've saved, right in one place.</Trans> ··· 735 735 /> 736 736 <View style={[a.flex_1, a.gap_sm]}> 737 737 <Text style={[a.flex_1, a.text_2xl, a.font_heavy, t.atoms.text]}> 738 - <Trans>Discover New Feeds </Trans> 738 + <Trans>Discover New Feeds</Trans> 739 739 </Text> 740 740 <Text style={[t.atoms.text_contrast_high]}> 741 741 <Trans>
-7
yarn.lock
··· 3635 3635 resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" 3636 3636 integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== 3637 3637 3638 - "@bsky.app/alf@^0.1.2": 3639 - version "0.1.2" 3640 - resolved "https://registry.yarnpkg.com/@bsky.app/alf/-/alf-0.1.2.tgz#8e3b3cd0b27f1dfe359d99edd2afd7d123b7ab69" 3641 - integrity sha512-lIidmkoHsqXwj07BY4fYIu/JyWGXRAGLfh65qhGzWpXLTK1DGyoQUjz5CwsqTDSQWpCfBC7eEaOtYjjv9cAjSQ== 3642 - dependencies: 3643 - react-responsive "^10.0.1" 3644 - 3645 3638 "@bufbuild/protobuf@^1.5.0": 3646 3639 version "1.7.0" 3647 3640 resolved "https://registry.yarnpkg.com/@bufbuild/protobuf/-/protobuf-1.7.0.tgz#cecddc8162a231642b410bc7b99309cd5969733c"