@swiftbrowser/web 0.26.1 → 0.26.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/styles.css CHANGED
@@ -434,6 +434,68 @@ html[data-sb-frame="ipad"]:not([data-sb-mode="device"]) .home-indicator {
434
434
  width: 315px;
435
435
  }
436
436
 
437
+ /* A Mac window (docs/notes/macos.md): 1024 x 700 points with a 28-point
438
+ title bar the page draws over the app's top (the safe area, as the
439
+ iPhone's status bar is), its traffic lights at the leading edge; no
440
+ island, side buttons, status glyphs or home indicator. The window's title
441
+ is the app's to draw (its navigation title, from the Mac idiom). */
442
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) {
443
+ --device-screen-width: 1024px;
444
+ --device-screen-height: 700px;
445
+ --device-bezel: 0px;
446
+ --device-radius: 11px;
447
+ --device-safe-top: 28px;
448
+ --device-safe-bottom: 0px;
449
+ }
450
+
451
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .device:not(.sb-island) {
452
+ background: none;
453
+ box-shadow:
454
+ 0 0 0 1px rgba(0, 0, 0, 0.18),
455
+ 0 22px 70px 4px rgba(0, 0, 0, 0.45);
456
+ }
457
+
458
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .device::before,
459
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .device::after,
460
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .dynamic-island,
461
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .status-time,
462
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .status-glyphs,
463
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .home-indicator {
464
+ display: none;
465
+ }
466
+
467
+ /* The title bar's window buttons (close, minimize, zoom): three lights 12
468
+ points across, 8 apart, 8 in from the edge, over the app. The bar itself
469
+ is the app's: a navigation screen at the top of the window draws its title
470
+ bar there (the Mac idiom below; the engine leaves the buttons their room),
471
+ and a window with no bar shows its content under them, as a Mac window
472
+ with a hidden title bar does. */
473
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .status-bar {
474
+ justify-content: flex-start;
475
+ padding: 0 0 0 8px;
476
+ background: none;
477
+ }
478
+
479
+ /* The lights sit (bar height − 12) / 2 from the corner: 8 in a plain 28
480
+ bar, 20 in a unified 52 one, 13 in a tab view's 38 toolbar. */
481
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .device:has(.sb-navscreen[data-sb-unified]) .status-bar::before {
482
+ transform: translate(12px, 12px);
483
+ }
484
+
485
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .device:has(.sb-tabview[data-sb-tabs-top]) .status-bar::before {
486
+ transform: translate(5px, 5px);
487
+ }
488
+
489
+ html[data-sb-frame="mac"]:not([data-sb-mode="device"]) .status-bar::before {
490
+ content: "";
491
+ width: 52px;
492
+ height: 12px;
493
+ background:
494
+ radial-gradient(circle at 6px 6px, #ff5f57 0 5.5px, transparent 6px),
495
+ radial-gradient(circle at 26px 6px, #febc2e 0 5.5px, transparent 6px),
496
+ radial-gradient(circle at 46px 6px, #28c840 0 5.5px, transparent 6px);
497
+ }
498
+
437
499
  html[data-sb-frame="none"]:not([data-sb-mode="device"]) .device:not(.sb-island) {
438
500
  flex: 1 1 auto;
439
501
  align-self: stretch;
@@ -4469,6 +4531,35 @@ svg.sb-path {
4469
4531
  transform: rotate(90deg);
4470
4532
  }
4471
4533
 
4534
+ /* In a list a disclosure group is an outline (src/layout/engine.ts
4535
+ `outlineRows`): its label and its content are rows of the card, each
4536
+ with its line below it while a shown row follows, and a button or link
4537
+ among them fills while pressed, as the card's own rows do. The group
4538
+ element, a row of the card itself, keeps the card's paint and the line
4539
+ under its last row. */
4540
+ .sb-disclosuregroup[data-sb-outline] > .sb-slot > [data-sb-id]:has(~ [data-sb-id]:not([hidden]))::after {
4541
+ content: "";
4542
+ position: absolute;
4543
+ left: var(--sb-separator-leading, 16px);
4544
+ right: 16px;
4545
+ bottom: 0;
4546
+ height: 1px;
4547
+ background: var(--sb-color-row-separator);
4548
+ pointer-events: none;
4549
+ }
4550
+
4551
+ .sb-disclosuregroup[data-sb-outline] > .sb-slot > .sb-button {
4552
+ border-radius: 0;
4553
+ font-size: var(--sb-font-size-body);
4554
+ }
4555
+
4556
+ .sb-disclosuregroup[data-sb-outline] > .sb-slot > .sb-button:active,
4557
+ .sb-disclosuregroup[data-sb-outline] > .sb-slot > .sb-navlink:active,
4558
+ .sb-disclosuregroup[data-sb-outline] > .sb-slot > [data-sb-row-pressed] {
4559
+ opacity: 1;
4560
+ background: var(--sb-color-fill);
4561
+ }
4562
+
4472
4563
  /* Collapsed: the content (a disclosure group's, a sidebar section's rows) is hidden by the engine, without a frame. */
4473
4564
  .sb-disclosuregroup > .sb-slot > [data-sb-id][hidden],
4474
4565
  .sb-disclosuregroup > .sb-slot > [data-sb-ghost][hidden],
@@ -4545,3 +4636,664 @@ svg.sb-path {
4545
4636
  [data-sb-composite] > * {
4546
4637
  --sb-shadow-filter: initial;
4547
4638
  }
4639
+
4640
+ /* ---------------------------------------------------------------------------
4641
+ The Mac idiom (docs/notes/macos.md): the renderer draws macOS when the
4642
+ platform is `macos` (`html[data-sb-platform]`, set by the renderer's
4643
+ environment and pre-set by the page from the device picker's Mac window).
4644
+ The layout engine's MAC_* metrics place everything; this restyles what the
4645
+ iOS idiom draws as Liquid Glass. First pass, to be measured against the
4646
+ real app (the Mac fidelity harness, stage 3).
4647
+ --------------------------------------------------------------------------- */
4648
+
4649
+ /* Measured in the Mac app (macOS 15, scripts/mac-screenshots.sh): the
4650
+ window's title bar is white (#1e1e1e dark) with a #cfcfcf rule under it,
4651
+ its content the window background #f6f6f6 (#282828), a list white
4652
+ (#1e1e1e) with #e6e6e6 (#343434) separators and a rule the bar's color
4653
+ under a header; secondary text is half the label color. */
4654
+ html[data-sb-platform="macos"] .device[data-theme="light"] {
4655
+ /* The window's title bar and toolbar, its controls, the separators. */
4656
+ --sb-mac-bar: #ffffff;
4657
+ --sb-mac-separator: rgba(0, 0, 0, 0.19);
4658
+ --sb-mac-control: #ffffff;
4659
+ --sb-mac-control-shadow:
4660
+ 0 0 0 0.5px rgba(0, 0, 0, 0.12),
4661
+ 0 1px 1px rgba(0, 0, 0, 0.08);
4662
+ /* A text field's edges: light at the sides and top, darker at the bottom. */
4663
+ --sb-mac-field-shadow:
4664
+ inset 0 0 0 1px rgba(0, 0, 0, 0.11),
4665
+ inset 0 -1px 0 0 rgba(0, 0, 0, 0.27);
4666
+ --sb-mac-segment-track: #ededed;
4667
+ --sb-mac-segment: #ffffff;
4668
+ --sb-mac-tab-selected: #f2f2f2;
4669
+ --sb-mac-sheet: #ececec;
4670
+ /* The window background, under content; a list's background and its rows. */
4671
+ --sb-color-system-background: #f6f6f6;
4672
+ --sb-color-grouped-background: #ffffff;
4673
+ --sb-color-grouped-cell: #ffffff;
4674
+ --sb-color-row-separator: rgba(0, 0, 0, 0.1);
4675
+ --sb-color-secondary: rgba(0, 0, 0, 0.5);
4676
+ }
4677
+
4678
+ html[data-sb-platform="macos"] .device[data-theme="dark"] {
4679
+ --sb-mac-bar: #1e1e1e;
4680
+ --sb-mac-separator: rgba(255, 255, 255, 0.2);
4681
+ --sb-mac-control: #5c5c5c;
4682
+ --sb-mac-control-shadow:
4683
+ 0 0 0 0.5px rgba(0, 0, 0, 0.4),
4684
+ 0 1px 1px rgba(0, 0, 0, 0.2);
4685
+ --sb-mac-field-shadow:
4686
+ inset 0 0 0 1px rgba(255, 255, 255, 0.12),
4687
+ inset 0 -1px 0 0 rgba(255, 255, 255, 0.2);
4688
+ --sb-mac-segment-track: #333333;
4689
+ --sb-mac-segment: #666666;
4690
+ --sb-mac-tab-selected: #292929;
4691
+ --sb-mac-sheet: #2b2b2b;
4692
+ --sb-color-system-background: #282828;
4693
+ --sb-color-grouped-background: #1e1e1e;
4694
+ --sb-color-grouped-cell: #1e1e1e;
4695
+ --sb-color-row-separator: rgba(255, 255, 255, 0.1);
4696
+ --sb-color-secondary: rgba(255, 255, 255, 0.55);
4697
+ }
4698
+
4699
+ /* The title bar in place of the navigation bar: opaque, the window's chrome
4700
+ color, a hairline under it; no scroll-edge gradient and no glass capsules
4701
+ (the items sit on the bar). */
4702
+ html[data-sb-platform="macos"] .sb-navbar {
4703
+ background: var(--sb-mac-bar);
4704
+ }
4705
+
4706
+ /* The rule under the title bar is the row below it (the content's first). */
4707
+ html[data-sb-platform="macos"] .sb-navbar::after {
4708
+ content: "";
4709
+ position: absolute;
4710
+ left: 0;
4711
+ right: 0;
4712
+ bottom: -1px;
4713
+ height: 1px;
4714
+ background: var(--sb-mac-separator);
4715
+ pointer-events: none;
4716
+ }
4717
+
4718
+ html[data-sb-platform="macos"] .sb-navbar::before,
4719
+ html[data-sb-platform="macos"] .sb-bar-glass {
4720
+ display: none;
4721
+ }
4722
+
4723
+ /* The back button, the More button and the sidebar toggle: bare 28
4724
+ buttons (the engine's `back`, `more`, `toggle` rects), not glass circles;
4725
+ the back chevron is a secondary-colored glyph (measured in the Mac app). */
4726
+ html[data-sb-platform="macos"] .sb-navbar-back,
4727
+ html[data-sb-platform="macos"] .sb-navbar-more,
4728
+ html[data-sb-platform="macos"] .sb-navsplit-toggle {
4729
+ width: 28px;
4730
+ height: 28px;
4731
+ border-radius: 6px;
4732
+ background: none;
4733
+ box-shadow: none;
4734
+ backdrop-filter: none;
4735
+ -webkit-backdrop-filter: none;
4736
+ font-size: 13px;
4737
+ --sb-press-scale: 1;
4738
+ }
4739
+
4740
+ html[data-sb-platform="macos"] .sb-navbar-back > svg {
4741
+ width: 14px;
4742
+ height: 14px;
4743
+ margin-left: -1px;
4744
+ color: var(--sb-color-secondary);
4745
+ }
4746
+
4747
+ /* A bar's text button is a bordered 28 button at its slot (the engine's
4748
+ `bordered` rect, `data-sb-bordered="inset"` as a list row's), 6 beside
4749
+ its label; its label the primary color. */
4750
+ html[data-sb-platform="macos"] .sb-navbar .sb-button[data-sb-bordered="inset"] {
4751
+ color: var(--sb-button-color, var(--sb-color-primary));
4752
+ }
4753
+
4754
+ html[data-sb-platform="macos"] .sb-navbar-back:active,
4755
+ html[data-sb-platform="macos"] .sb-navbar-more:active {
4756
+ opacity: 1;
4757
+ background: var(--sb-color-fill);
4758
+ }
4759
+
4760
+ /* The title: the headline (13 semibold) centered in a plain title bar; in a
4761
+ unified one the window title, leading-aligned after the back button and
4762
+ the leading items, 15 semibold (the engine's `title` rect and font). */
4763
+ html[data-sb-platform="macos"] .sb-navbar-title {
4764
+ font-size: var(--sb-ts-headline-size, 13px);
4765
+ }
4766
+
4767
+ html[data-sb-platform="macos"] .sb-navscreen[data-sb-unified] > .sb-navbar > .sb-navbar-title {
4768
+ text-align: start;
4769
+ font-size: var(--sb-ts-title3-size, 15px);
4770
+ }
4771
+
4772
+ /* The tab bar: a segmented control at the top of the content (the engine's
4773
+ Mac tab view), each tab a segment with its title alone, the selected one
4774
+ raised; no icons, no glass. */
4775
+ html[data-sb-platform="macos"] .sb-tabbar {
4776
+ z-index: 2;
4777
+ border-radius: 6px;
4778
+ background: none;
4779
+ box-shadow: inset 0 0 0 1px var(--sb-color-row-separator);
4780
+ backdrop-filter: none;
4781
+ -webkit-backdrop-filter: none;
4782
+ }
4783
+
4784
+ html[data-sb-platform="macos"] .sb-tabbar-item {
4785
+ border-radius: 5px;
4786
+ color: var(--sb-color-primary);
4787
+ }
4788
+
4789
+ html[data-sb-platform="macos"] .sb-tabbar-item[aria-selected="true"] {
4790
+ color: var(--sb-color-primary);
4791
+ background: var(--sb-mac-tab-selected);
4792
+ box-shadow: none;
4793
+ }
4794
+
4795
+ html[data-sb-platform="macos"] .sb-tabbar-icon,
4796
+ html[data-sb-platform="macos"] .sb-tabbar-badge {
4797
+ display: none;
4798
+ }
4799
+
4800
+ html[data-sb-platform="macos"] .sb-tabbar-title {
4801
+ font-size: 13px;
4802
+ line-height: 16px;
4803
+ font-weight: 400;
4804
+ letter-spacing: 0;
4805
+ }
4806
+
4807
+ /* Buttons: a bordered button, and an automatic one the engine bordered
4808
+ (`data-sb-bordered`: outside a list row and a bar), is the Mac's push
4809
+ button, 22 tall with a 6 radius, the control color with a hairline and a
4810
+ shadow, its label the primary color; a prominent one the accent with
4811
+ white text. */
4812
+ html[data-sb-platform="macos"] .sb-button[data-sb-style="bordered"],
4813
+ html[data-sb-platform="macos"] .sb-button[data-sb-style="automatic"][data-sb-bordered],
4814
+ html[data-sb-platform="macos"] .sb-button[data-sb-style="borderedProminent"] {
4815
+ border-radius: 6px;
4816
+ background: var(--sb-mac-control);
4817
+ box-shadow: var(--sb-mac-control-shadow);
4818
+ color: var(--sb-button-color, var(--sb-color-primary));
4819
+ }
4820
+
4821
+ html[data-sb-platform="macos"] .sb-button[data-sb-style="borderedProminent"] {
4822
+ background: var(--sb-tint, var(--sb-color-accent));
4823
+ color: #ffffff;
4824
+ }
4825
+
4826
+ /* A disabled push button is faded, not grayed; a plain button's label is
4827
+ the secondary color (measured in the Mac app). */
4828
+ html[data-sb-platform="macos"] [data-sb-disabled] > .sb-button:is([data-sb-style="bordered"], [data-sb-style="borderedProminent"], [data-sb-bordered]) {
4829
+ background: var(--sb-mac-control);
4830
+ color: var(--sb-color-primary);
4831
+ opacity: 0.5;
4832
+ }
4833
+
4834
+ html[data-sb-platform="macos"] [data-sb-disabled] > .sb-button[data-sb-style="borderedProminent"] {
4835
+ background: var(--sb-tint, var(--sb-color-accent));
4836
+ color: #ffffff;
4837
+ }
4838
+
4839
+ html[data-sb-platform="macos"] .sb-button[data-sb-style="plain"] {
4840
+ color: var(--sb-button-color, var(--sb-color-secondary));
4841
+ }
4842
+
4843
+ /* A segmented control (measured in the Mac app): 22 tall with a 5 radius,
4844
+ a gray track under a hairline, 13-point regular labels, the selected
4845
+ segment white (dark: lighter gray) with a shadow, 1 in; its label (the
4846
+ engine's `label`) before it in the row's font. */
4847
+ html[data-sb-platform="macos"] .sb-picker[data-sb-style="segmented"]:not([data-sb-bar]) > .sb-segment-track {
4848
+ border-radius: 5px;
4849
+ background: var(--sb-mac-segment-track);
4850
+ box-shadow: inset 0 0 0 0.5px var(--sb-mac-separator);
4851
+ }
4852
+
4853
+ html[data-sb-platform="macos"] .sb-picker[data-sb-style="segmented"]:not([data-sb-bar]) > .sb-segment {
4854
+ font: 400 13px/16px var(--sb-font-family);
4855
+ letter-spacing: 0;
4856
+ }
4857
+
4858
+ html[data-sb-platform="macos"] .sb-picker[data-sb-style="segmented"]:not([data-sb-bar]) > .sb-segment::before {
4859
+ inset: 1px;
4860
+ border-radius: 4px;
4861
+ }
4862
+
4863
+ html[data-sb-platform="macos"] .sb-picker[data-sb-style="segmented"]:not([data-sb-bar]) > .sb-segment[aria-checked="true"]::before {
4864
+ background: var(--sb-mac-segment);
4865
+ box-shadow: var(--sb-mac-control-shadow);
4866
+ }
4867
+
4868
+ html[data-sb-platform="macos"] .sb-picker[data-sb-style="segmented"] > .sb-picker-label {
4869
+ color: var(--sb-color-primary);
4870
+ }
4871
+
4872
+ /* A toggle outside a list row is a checkbox (the engine's `checkbox` rect:
4873
+ 14 square before the label), the accent with a check mark while on. */
4874
+ html[data-sb-platform="macos"] .sb-toggle[data-sb-checkbox] > .sb-switch {
4875
+ border-radius: 3px;
4876
+ background: var(--sb-mac-control);
4877
+ box-shadow: var(--sb-mac-control-shadow);
4878
+ }
4879
+
4880
+ html[data-sb-platform="macos"] .sb-toggle[data-sb-checkbox] > .sb-switch[aria-checked="true"] {
4881
+ background: var(--sb-tint, var(--sb-color-accent));
4882
+ }
4883
+
4884
+ html[data-sb-platform="macos"] .sb-toggle[data-sb-checkbox] > .sb-switch > .sb-switch-knob {
4885
+ display: none;
4886
+ }
4887
+
4888
+ html[data-sb-platform="macos"] .sb-toggle[data-sb-checkbox] > .sb-switch[aria-checked="true"]::after {
4889
+ content: "";
4890
+ position: absolute;
4891
+ left: 4.5px;
4892
+ top: 1.5px;
4893
+ width: 3.5px;
4894
+ height: 7.5px;
4895
+ border: solid #ffffff;
4896
+ border-width: 0 2px 2px 0;
4897
+ transform: rotate(45deg);
4898
+ }
4899
+
4900
+ /* A toggle in a list row (a grouped form's) is the small switch, 26 × 15. */
4901
+ html[data-sb-platform="macos"] .sb-list .sb-toggle:not([data-sb-checkbox]):not([data-sb-toggle-style="button"]) > .sb-switch > .sb-switch-knob {
4902
+ top: 1px;
4903
+ left: 1px;
4904
+ width: 13px;
4905
+ height: 13px;
4906
+ border-radius: 50%;
4907
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
4908
+ }
4909
+
4910
+ html[data-sb-platform="macos"] .sb-list .sb-toggle:not([data-sb-checkbox]):not([data-sb-toggle-style="button"]) > .sb-switch[aria-checked="true"] > .sb-switch-knob {
4911
+ transform: translateX(11px);
4912
+ }
4913
+
4914
+ /* A menu picker outside a list row is a pop-up button: its value and the
4915
+ chevrons in a bordered button (the engine's `popup` rect), the chevrons
4916
+ on an accent square at its trailing end. */
4917
+ html[data-sb-platform="macos"] .sb-picker[data-sb-popup] > .sb-picker-value {
4918
+ box-sizing: border-box;
4919
+ padding: 0 3px 0 8px;
4920
+ gap: 6px;
4921
+ border-radius: 5px;
4922
+ background: var(--sb-mac-control);
4923
+ box-shadow: var(--sb-mac-control-shadow);
4924
+ color: var(--sb-color-primary);
4925
+ }
4926
+
4927
+ html[data-sb-platform="macos"] .sb-picker[data-sb-popup] > .sb-picker-value > svg {
4928
+ box-sizing: border-box;
4929
+ width: 16px;
4930
+ height: 16px;
4931
+ padding: 3px;
4932
+ border-radius: 4px;
4933
+ background: var(--sb-tint, var(--sb-color-accent));
4934
+ color: #ffffff;
4935
+ stroke-width: 3;
4936
+ }
4937
+
4938
+ /* Lists: no cards (the rows run the list's width on its white), a separator
4939
+ under every row from its first text to 16 before the edge, a rule across
4940
+ the list 8 under a header and 5 under a footer; a selected row is the
4941
+ accent with white text (the sidebar's, when the window is key). The
4942
+ engine draws no chevrons. */
4943
+ html[data-sb-platform="macos"] .sb-section-rows,
4944
+ html[data-sb-platform="macos"] .sb-list-content > :not(.sb-section) {
4945
+ border-radius: 0;
4946
+ background: none;
4947
+ }
4948
+
4949
+ html[data-sb-platform="macos"] .sb-section-rows > [data-sb-id],
4950
+ html[data-sb-platform="macos"] .sb-section-rows > [data-sb-ghost] {
4951
+ background: var(--sb-row-background, transparent);
4952
+ }
4953
+
4954
+ html[data-sb-platform="macos"] .sb-section-rows > :last-child::after,
4955
+ html[data-sb-platform="macos"] .sb-list-content > :not(.sb-section):last-child::after,
4956
+ html[data-sb-platform="macos"] .sb-list-content > :not(.sb-section):has(+ .sb-section)::after {
4957
+ content: "";
4958
+ position: absolute;
4959
+ left: var(--sb-separator-leading, 16px);
4960
+ right: 16px;
4961
+ bottom: 0;
4962
+ height: 1px;
4963
+ background: var(--sb-color-row-separator);
4964
+ pointer-events: none;
4965
+ }
4966
+
4967
+ html[data-sb-platform="macos"] .sb-section-header,
4968
+ html[data-sb-platform="macos"] .sb-section-footer {
4969
+ color: var(--sb-color-secondary);
4970
+ }
4971
+
4972
+ html[data-sb-platform="macos"] .sb-section-header::after,
4973
+ html[data-sb-platform="macos"] .sb-section-footer::after {
4974
+ content: "";
4975
+ position: absolute;
4976
+ left: -16px;
4977
+ right: -16px;
4978
+ bottom: -9px;
4979
+ height: 1px;
4980
+ background: var(--sb-mac-separator);
4981
+ pointer-events: none;
4982
+ }
4983
+
4984
+ html[data-sb-platform="macos"] .sb-section-footer::after {
4985
+ display: none;
4986
+ bottom: -6px;
4987
+ background: var(--sb-color-row-separator);
4988
+ }
4989
+
4990
+ /* The rule under a footer only where another section follows. */
4991
+ html[data-sb-platform="macos"] .sb-section:has(+ .sb-section) > .sb-section-footer::after {
4992
+ display: block;
4993
+ }
4994
+
4995
+ /* A button in a list row is a push button at its own size (the engine's
4996
+ `bordered` rect, `data-sb-bordered="inset"`), on the row, not the row
4997
+ itself; a destructive one is not tinted. */
4998
+ html[data-sb-platform="macos"] .sb-button[data-sb-style][data-sb-bordered="inset"] {
4999
+ border-radius: 0;
5000
+ background: none;
5001
+ box-shadow: none;
5002
+ }
5003
+
5004
+ html[data-sb-platform="macos"] .sb-button[data-sb-style][data-sb-bordered="inset"]::before {
5005
+ content: "";
5006
+ position: absolute;
5007
+ left: var(--sb-bordered-left);
5008
+ top: var(--sb-bordered-top);
5009
+ width: var(--sb-bordered-width);
5010
+ height: var(--sb-bordered-height);
5011
+ border-radius: 6px;
5012
+ background: var(--sb-mac-control);
5013
+ box-shadow: var(--sb-mac-control-shadow);
5014
+ pointer-events: none;
5015
+ }
5016
+
5017
+ html[data-sb-platform="macos"] .sb-button[data-sb-bordered][data-sb-role="destructive"],
5018
+ html[data-sb-platform="macos"] .sb-button[data-sb-style="bordered"][data-sb-role="destructive"] {
5019
+ color: var(--sb-color-primary);
5020
+ }
5021
+
5022
+ html[data-sb-platform="macos"] .sb-navlink[data-sb-selected],
5023
+ html[data-sb-platform="macos"] .sb-list[data-sb-list-style] > .sb-list-content > .sb-navlink[data-sb-selected],
5024
+ html[data-sb-platform="macos"] .sb-list[data-sb-list-style] .sb-section-rows > .sb-navlink[data-sb-selected] {
5025
+ border-radius: 5px;
5026
+ background: var(--sb-tint, var(--sb-color-accent));
5027
+ color: #ffffff;
5028
+ --sb-button-color: #ffffff;
5029
+ }
5030
+
5031
+ /* A selected `listrow` (a sidebar's rows select as rows) is the accent too;
5032
+ the link in it stays clear, as above. */
5033
+ html[data-sb-platform="macos"] .sb-listrow[data-sb-selected],
5034
+ html[data-sb-platform="macos"] .sb-list[data-sb-list-style] > .sb-list-content > .sb-listrow[data-sb-selected],
5035
+ html[data-sb-platform="macos"] .sb-list[data-sb-list-style] .sb-section-rows > .sb-listrow[data-sb-selected] {
5036
+ border-radius: 5px;
5037
+ background: var(--sb-tint, var(--sb-color-accent));
5038
+ color: #ffffff;
5039
+ --sb-button-color: #ffffff;
5040
+ }
5041
+
5042
+ html[data-sb-platform="macos"] .sb-listrow .sb-navlink[data-sb-selected] {
5043
+ background: transparent;
5044
+ }
5045
+
5046
+ /* A search field, in the title bar (the engine's `searchBar`) or on its
5047
+ own (a list row's, 22 tall): a bordered field with the magnifier, no glass. */
5048
+ html[data-sb-platform="macos"] .sb-searchfield {
5049
+ gap: 4px;
5050
+ padding: 0 6px 0 5px;
5051
+ border-radius: 6px;
5052
+ background: var(--sb-mac-control);
5053
+ box-shadow: var(--sb-mac-control-shadow);
5054
+ backdrop-filter: none;
5055
+ -webkit-backdrop-filter: none;
5056
+ }
5057
+
5058
+ html[data-sb-platform="macos"] .sb-searchfield::after {
5059
+ display: none;
5060
+ }
5061
+
5062
+ html[data-sb-platform="macos"] .sb-searchfield > svg {
5063
+ width: 13px;
5064
+ height: 13px;
5065
+ color: var(--sb-color-secondary);
5066
+ }
5067
+
5068
+ html[data-sb-platform="macos"] .sb-searchfield > .sb-searchfield-input {
5069
+ font-size: 13px;
5070
+ }
5071
+
5072
+ html[data-sb-platform="macos"] .sb-searchfield > .sb-searchfield-input::placeholder {
5073
+ color: var(--sb-color-tertiary-label);
5074
+ }
5075
+
5076
+ /* A sheet is a window-modal panel hanging from the title bar (the engine's
5077
+ form sheet on a Mac): square at the top, rounded below, a shadow; it
5078
+ drops in from above rather than sliding up. */
5079
+ /* A sheet (measured in the Mac app): a panel centered in the window with a
5080
+ 10 radius and a shadow, its content on the window color under the white
5081
+ title bar (the stack's bar: its title leading, 13 bold); its actions in a
5082
+ 60 bar at the bottom under a rule (the engine's `actions`). */
5083
+ html[data-sb-platform="macos"] .sb-sheet[data-sb-form] > .sb-sheet-card {
5084
+ --sb-sheet-offscreen: -100vh;
5085
+ border-radius: 10px;
5086
+ background: var(--sb-mac-sheet);
5087
+ box-shadow:
5088
+ 0 0 0 0.5px rgba(0, 0, 0, 0.25),
5089
+ 0 12px 40px rgba(0, 0, 0, 0.35);
5090
+ }
5091
+
5092
+ html[data-sb-platform="macos"] .sb-sheet[data-sb-form][data-sb-actions] > .sb-sheet-card::after {
5093
+ content: "";
5094
+ position: absolute;
5095
+ left: 0;
5096
+ right: 0;
5097
+ bottom: 0;
5098
+ height: 60px;
5099
+ box-shadow: inset 0 1px 0 var(--sb-color-row-separator);
5100
+ pointer-events: none;
5101
+ }
5102
+
5103
+ html[data-sb-platform="macos"] .sb-navscreen[data-sb-sheet-bar] > .sb-navbar > .sb-navbar-title {
5104
+ text-align: start;
5105
+ font-size: 13px;
5106
+ font-weight: 700;
5107
+ }
5108
+
5109
+ /* The sheet's actions are push buttons (the engine places them in the bottom bar). */
5110
+ html[data-sb-platform="macos"] .sb-navscreen[data-sb-sheet-bar] > .sb-toolbar .sb-button[data-sb-bordered] {
5111
+ color: var(--sb-button-color, var(--sb-color-primary));
5112
+ }
5113
+
5114
+ /* Text fields: 22 tall and bordered in every style but `plain`, the control
5115
+ color with a hairline, a 5 radius, the text 6 in. */
5116
+ html[data-sb-platform="macos"] .sb-textfield:not([data-sb-style="plain"]) {
5117
+ box-sizing: border-box;
5118
+ padding: 0 6px;
5119
+ border: 0;
5120
+ border-radius: 5px;
5121
+ background: var(--sb-mac-control);
5122
+ box-shadow: var(--sb-mac-field-shadow);
5123
+ font-size: 13px;
5124
+ }
5125
+
5126
+ html[data-sb-platform="macos"] .sb-textfield:not([data-sb-style="plain"]):focus {
5127
+ box-shadow:
5128
+ var(--sb-mac-field-shadow),
5129
+ 0 0 0 3.5px color-mix(in srgb, var(--sb-tint, var(--sb-color-accent)) 50%, transparent);
5130
+ }
5131
+
5132
+ /* A text editor draws its own white (the Mac's text background), whatever is behind it. */
5133
+ html[data-sb-platform="macos"] .sb-texteditor {
5134
+ background: var(--sb-color-grouped-cell);
5135
+ }
5136
+
5137
+ /* A stepper's control is the Mac's pair of arrows (the engine's `arrows`
5138
+ rect, 13 × 22): up over down, in one bordered control. */
5139
+ html[data-sb-platform="macos"] .sb-stepper[data-sb-arrows] > .sb-stepper-control {
5140
+ flex-direction: column-reverse;
5141
+ border-radius: 5px;
5142
+ background: var(--sb-mac-control);
5143
+ box-shadow: var(--sb-mac-control-shadow);
5144
+ }
5145
+
5146
+ html[data-sb-platform="macos"] .sb-stepper[data-sb-arrows] > .sb-stepper-control > .sb-stepper-button {
5147
+ min-height: 0;
5148
+ font-size: 0;
5149
+ line-height: 0;
5150
+ }
5151
+
5152
+ html[data-sb-platform="macos"] .sb-stepper[data-sb-arrows] > .sb-stepper-control > .sb-stepper-button::after {
5153
+ content: "";
5154
+ width: 0;
5155
+ height: 0;
5156
+ border: 3px solid transparent;
5157
+ border-bottom: 4px solid var(--sb-color-primary);
5158
+ border-top: 0;
5159
+ transform: translateY(-1px);
5160
+ }
5161
+
5162
+ html[data-sb-platform="macos"] .sb-stepper[data-sb-arrows] > .sb-stepper-control > .sb-stepper-button:first-child::after {
5163
+ border-bottom: 0;
5164
+ border-top: 4px solid var(--sb-color-primary);
5165
+ transform: translateY(1px);
5166
+ }
5167
+
5168
+ html[data-sb-platform="macos"] .sb-stepper[data-sb-arrows] > .sb-stepper-control > .sb-stepper-button + .sb-stepper-button::before {
5169
+ display: none;
5170
+ }
5171
+
5172
+ /* An alert is a panel (the engine's `panel` rect, 260 wide): the window
5173
+ color with a 10 radius and a shadow, no glass, its title and message
5174
+ centered; its buttons are push buttons, the default one (the last that is
5175
+ not a cancel) the accent. */
5176
+ html[data-sb-platform="macos"] .sb-alert[data-sb-panel] .sb-alert-card {
5177
+ border-radius: 10px;
5178
+ background: var(--sb-mac-bar);
5179
+ box-shadow:
5180
+ 0 0 0 0.5px rgba(0, 0, 0, 0.2),
5181
+ 0 12px 40px rgba(0, 0, 0, 0.3);
5182
+ backdrop-filter: none;
5183
+ -webkit-backdrop-filter: none;
5184
+ }
5185
+
5186
+ /* The app's icon, 54 at the top of the panel (a generic one: the page has none). */
5187
+ html[data-sb-platform="macos"] .sb-alert[data-sb-panel] .sb-alert-card::before {
5188
+ content: "";
5189
+ position: absolute;
5190
+ top: 25px;
5191
+ left: 50%;
5192
+ width: 54px;
5193
+ height: 54px;
5194
+ margin-left: -27px;
5195
+ border-radius: 12px;
5196
+ background:
5197
+ linear-gradient(rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0)),
5198
+ repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.08) 0 1px, transparent 1px 9px),
5199
+ repeating-linear-gradient(90deg, rgba(0, 0, 0, 0.08) 0 1px, transparent 1px 9px),
5200
+ #d3e0e5;
5201
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
5202
+ }
5203
+
5204
+ /* Measured in the Mac app: the buttons gray (the control color darkened),
5205
+ 28 tall, 13 regular; a destructive one red; a lone OK the accent. */
5206
+ html[data-sb-platform="macos"] .sb-alert[data-sb-panel] .sb-alert-buttons > .sb-button,
5207
+ html[data-sb-platform="macos"] .sb-alert[data-sb-panel] .sb-alert-ok {
5208
+ border-radius: 6px;
5209
+ background: var(--sb-color-fill);
5210
+ box-shadow: none;
5211
+ color: var(--sb-color-primary);
5212
+ font-size: 13px;
5213
+ }
5214
+
5215
+ html[data-sb-platform="macos"] .sb-alert[data-sb-panel] .sb-alert-ok {
5216
+ background: var(--sb-tint, var(--sb-color-accent));
5217
+ color: #ffffff;
5218
+ }
5219
+
5220
+ html[data-sb-platform="macos"] .sb-alert[data-sb-panel] .sb-alert-buttons > .sb-button[data-sb-role="destructive"] {
5221
+ color: var(--sb-color-red);
5222
+ }
5223
+
5224
+ html[data-sb-platform="macos"] .sb-alert[data-sb-panel] .sb-alert-buttons > .sb-button:active,
5225
+ html[data-sb-platform="macos"] .sb-alert[data-sb-panel] .sb-alert-ok:active {
5226
+ filter: brightness(0.92);
5227
+ }
5228
+
5229
+ /* A slider's knob is the Mac's round one (the engine's `knob` rect, 20) on
5230
+ a 4 track. */
5231
+ html[data-sb-platform="macos"] .sb-slider[data-sb-knob] > .sb-slider-track,
5232
+ html[data-sb-platform="macos"] .sb-slider[data-sb-knob] > .sb-slider-fill {
5233
+ border-radius: 2px;
5234
+ }
5235
+
5236
+ html[data-sb-platform="macos"] .sb-slider[data-sb-knob] > .sb-slider-thumb {
5237
+ border-radius: 50%;
5238
+ box-shadow:
5239
+ 0 0 0 0.5px rgba(0, 0, 0, 0.2),
5240
+ 0 1px 2px rgba(0, 0, 0, 0.2);
5241
+ }
5242
+
5243
+ /* A compact date picker's date and time are bordered fields (the engine's
5244
+ `fields` rect spans them), 22 tall. */
5245
+ html[data-sb-platform="macos"] .sb-datepicker[data-sb-fields] > .sb-datepicker-capsule,
5246
+ html[data-sb-platform="macos"] .sb-datepicker[data-sb-fields] > .sb-datepicker-date,
5247
+ html[data-sb-platform="macos"] .sb-datepicker[data-sb-fields] > .sb-datepicker-time {
5248
+ border-radius: 5px;
5249
+ background: var(--sb-mac-control);
5250
+ box-shadow: var(--sb-mac-control-shadow);
5251
+ font-size: 13px;
5252
+ }
5253
+
5254
+ /* A menu outside a bar and a list row is a pull-down button (the engine's
5255
+ `pulldown` rect): a push button around the label with the chevrons on an
5256
+ accent square at its trailing end. */
5257
+ html[data-sb-platform="macos"] .sb-menu[data-sb-pulldown] {
5258
+ position: relative;
5259
+ border-radius: 6px;
5260
+ background: var(--sb-mac-control);
5261
+ box-shadow: var(--sb-mac-control-shadow);
5262
+ color: var(--sb-color-primary);
5263
+ }
5264
+
5265
+ html[data-sb-platform="macos"] .sb-menu[data-sb-pulldown]:active {
5266
+ opacity: 1;
5267
+ filter: brightness(0.92);
5268
+ }
5269
+
5270
+ html[data-sb-platform="macos"] .sb-menu[data-sb-pulldown]::after {
5271
+ content: "";
5272
+ position: absolute;
5273
+ right: 3px;
5274
+ top: 50%;
5275
+ width: 16px;
5276
+ height: 16px;
5277
+ margin-top: -8px;
5278
+ border-radius: 4px;
5279
+ background:
5280
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 6.5 8 3.5l3 3M5 9.5l3 3 3-3'/%3E%3C/svg%3E") center / 16px 16px no-repeat,
5281
+ var(--sb-tint, var(--sb-color-accent));
5282
+ pointer-events: none;
5283
+ }
5284
+
5285
+ /* The sidebar material: a sidebar list sits on the Mac's sidebar gray, the
5286
+ window's chrome color (lighter than the grouped background). */
5287
+ html[data-sb-platform="macos"] .device[data-theme="light"] {
5288
+ --sb-mac-sidebar: #e8e8e8;
5289
+ }
5290
+
5291
+ html[data-sb-platform="macos"] .device[data-theme="dark"] {
5292
+ --sb-mac-sidebar: #2b2b2b;
5293
+ }
5294
+
5295
+ html[data-sb-platform="macos"] .sb-list[data-sb-list-look="sidebar"] {
5296
+ background: var(--sb-mac-sidebar);
5297
+ --sb-icon-knockout: var(--sb-mac-sidebar);
5298
+ }
5299
+