@telepath-computer/television 1.3.2 → 1.3.4

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.
@@ -106,20 +106,18 @@ These four tokens are enough to replace the main surfaces and text, but they do
106
106
  alone. Between the tables themselves, source order decides: the dark
107
107
  table follows the light one, so it wins where the attribute matches. */
108
108
  :where(:root) {
109
- /* A surface's inner edge moves toward its light pole; its outer line moves
110
- toward its dark pole. Both follow the surface rather than appearance. */
111
- --surface-border-color: color-mix(in oklch, var(--color-surface), oklch(from var(--color-surface) 1 0 h) var(--alpha-15));
112
- --surface-outline-color: color-mix(in oklch, var(--color-surface), oklch(from var(--color-surface) 0 0 h) var(--alpha-10));
113
- --surface-outline-width: 1px;
114
- --surface-outline: var(--surface-outline-width) solid var(--surface-outline-color);
109
+ /* Complete decorative paints. The consuming pseudo sets 1em to its radius. */
110
+ --panel-edge-highlight: linear-gradient(to bottom,
111
+ rgb(255 255 255 / .36) 0 .5px,
112
+ rgb(255 255 255 / .28) .5px 1px,
113
+ rgb(255 255 255 / .20) 1em);
114
+ --panel-edge-shadow: 0 0 0 .5px rgb(0 0 0 / .205);
115
115
 
116
116
  /* Panels: popovers, menus, selects and dialogs. */
117
117
  --panel-background: var(--color-surface);
118
118
  --panel-text-color: var(--color-text);
119
- --panel-border-color: var(--surface-border-color);
120
- --panel-border-width: 1px;
121
- --panel-border: var(--panel-border-width) solid var(--panel-border-color);
122
- --panel-outline: var(--surface-outline);
119
+ --panel-border-color: var(--color-border);
120
+ --panel-border: none;
123
121
 
124
122
  /* Options: menu items and select options. */
125
123
  --option-background-highlighted: color-mix(in oklch, transparent, var(--option-background-active) var(--hover-mix));
@@ -423,6 +421,7 @@ These four tokens are enough to replace the main surfaces and text, but they do
423
421
  on near-black), and every derived step follows. The neutral slot does not
424
422
  move — the roles flip which steps they take. */
425
423
  :where([data-theme="dark"]) {
424
+ --panel-edge-shadow: 0 0 0 .5px rgb(0 0 0 / .912);
426
425
  --alpha-active: 12%;
427
426
  --red: oklch(0.704 0.191 22.216);
428
427
  --orange: oklch(0.75 0.183 55.934);
@@ -574,10 +573,8 @@ These four tokens are enough to replace the main surfaces and text, but they do
574
573
  --sidebar-background: var(--color-surface-muted);
575
574
  --sidebar-text-color: var(--color-text);
576
575
  --sidebar-shadow: none;
577
- --sidebar-border-color: var(--surface-border-color);
578
- --sidebar-border-width: 1px;
579
- --sidebar-border: var(--sidebar-border-width) solid var(--sidebar-border-color);
580
- --sidebar-outline: var(--surface-outline);
576
+ --sidebar-border-color: color-mix(in oklch, var(--color-surface), oklch(from var(--color-surface) 1 0 h) var(--alpha-15));
577
+ --sidebar-border: var(--panel-border);
581
578
  --sidebar-heading-text-color: var(--color-text-muted);
582
579
  --sidebar-heading-font-size: var(--text-md);
583
580
  --sidebar-width: 260px;
@@ -599,10 +596,8 @@ These four tokens are enough to replace the main surfaces and text, but they do
599
596
  /* Artifact frame and title bar. */
600
597
  --artifact-frame-shadow: var(--shadow-xl);
601
598
  --frame-background: var(--color-surface);
602
- --frame-border-color: var(--surface-border-color);
603
- --frame-border-width: 1px;
604
- --frame-border: var(--frame-border-width) solid var(--frame-border-color);
605
- --frame-outline: var(--surface-outline);
599
+ --frame-border-color: var(--color-border);
600
+ --frame-border: var(--panel-border);
606
601
  --frame-titlebar-background: var(--color-surface-muted);
607
602
  --frame-titlebar-text-color: var(--color-text);
608
603
  --frame-titlebar-border-color: transparent;
@@ -665,9 +660,9 @@ These four tokens are enough to replace the main surfaces and text, but they do
665
660
  --tab-background-active: var(--wallpaper-overlay-background-active);
666
661
  --tab-background-selected: var(--color-surface-muted);
667
662
  /* Reserve the edge in every state so theme borders do not shift tabs. */
668
- --tab-border-selected: 1px solid var(--surface-border-color);
663
+ --tab-border-selected: 1px solid transparent;
669
664
  --tab-outline: var(--wallpaper-overlay-outline);
670
- --tab-outline-selected: var(--surface-outline);
665
+ --tab-outline-selected: none;
671
666
 
672
667
  /* The drag placeholder's ghost fill — the "a carried thing could land
673
668
  here" mark the tab strip and the sidebar share
@@ -738,7 +733,7 @@ For the optional iframe surfaces and protected overlay stacking, see [Theme effe
738
733
  </nav>
739
734
  ```
740
735
 
741
- `.sidebar` paints its light inner edge over its own background, alongside its optional soft shadow. The app shell paints the adjoining dark line as the left border of `.app-main`, so it blends over the wallpaper without a raised layer. `.sidebar-titlebar` reserves the window controls and drag area. `.sidebar-body` scrolls both groups together; `.sidebar:has(.sidebar-body[continues-start]) .sidebar-titlebar` draws the top boundary while content extends above the viewport. `.channel-group + .channel-group` separates the groups, and `.channel-group-label` styles their labels. `.channel-create` sits at the right of the titlebar and is excluded from window dragging.
736
+ `.sidebar::after` paints the light inner seam over the sidebar background, alongside its optional soft shadow. `.app-main::before` paints the adjoining fractional dark seam over the wallpaper. Both are pointer-transparent. The sidebar accepts an independent native border; the main region reserves the exterior seam track. `.sidebar-titlebar` reserves the window controls and drag area. `.sidebar-body` scrolls both groups together; `.sidebar:has(.sidebar-body[continues-start]) .sidebar-titlebar` draws the top boundary while content extends above the viewport. `.channel-group + .channel-group` separates the groups, and `.channel-group-label` styles their labels. `.channel-create` sits at the right of the titlebar and is excluded from window dragging.
742
737
 
743
738
  The channel name and its menu trigger are siblings within the row. `.channel` owns the name box; `.channel[aria-selected="true"]` paints the selection. The selected row changes `.channel-menu-trigger` text color through `.channel-row:has(> .channel[aria-selected="true"])`. Shared foundation tints follow that color for hover, press and expanded states. A hover or an expanded trigger preserves the unselected row tint through `:where(.channel-row:hover, .channel-row:has(.channel-menu-trigger[aria-expanded="true"])) .channel:not([aria-selected="true"])`. Trigger visibility follows row hover, `:focus-visible`, selected state, and expanded state. Use the expanded trigger state when styling an open menu subject. Panels remain in their authored DOM position when opened.
744
739
 
@@ -788,21 +783,23 @@ An empty channel adds `.stage-empty`, containing an artifact `tv-icon` and a par
788
783
 
789
784
  ```html
790
785
  <div class="artifact-frame">
791
- <iframe title="…"></iframe>
792
- <footer class="artifact-title-bar">
793
- <tv-icon name="artifact"></tv-icon>
794
- <span class="artifact-title">…</span>
795
- <!-- Navigation controls appear together when either direction exists. -->
796
- <button class="artifact-back" icon variant="ghost" size="sm">…</button>
797
- <button class="artifact-forward" icon variant="ghost" size="sm">…</button>
798
- <span class="artifact-bar-divider" aria-hidden="true"></span>
799
- <button class="artifact-menu-trigger" icon variant="ghost" size="sm">…</button>
800
- <tv-menu>…</tv-menu>
801
- </footer>
786
+ <div class="artifact-frame-clip">
787
+ <iframe title="…"></iframe>
788
+ <footer class="artifact-title-bar">
789
+ <tv-icon name="artifact"></tv-icon>
790
+ <span class="artifact-title">…</span>
791
+ <!-- Navigation controls appear together when either direction exists. -->
792
+ <button class="artifact-back" icon variant="ghost" size="sm">…</button>
793
+ <button class="artifact-forward" icon variant="ghost" size="sm">…</button>
794
+ <span class="artifact-bar-divider" aria-hidden="true"></span>
795
+ <button class="artifact-menu-trigger" icon variant="ghost" size="sm">…</button>
796
+ <tv-menu>…</tv-menu>
797
+ </footer>
798
+ </div>
802
799
  </div>
803
800
  ```
804
801
 
805
- `.artifact-frame` owns the border, curve, surface and shadow; background pages suppress the shadow. `.artifact-frame > iframe` fills the document area. `.artifact-title-bar` paints the lower band, `.artifact-title-bar .artifact-title` takes the remaining width and truncates, and `.artifact-bar-divider` separates navigation from the menu trigger. The two direction buttons use `disabled` to show unavailable history. The document repeats the top clipping radius where required for composited iframe/webview rendering.
802
+ `.artifact-frame` owns the border, curve, surface and broad shadow. Its `::before` paints the sharp rim and its `::after` paints a pointer-transparent masked inner highlight over document and titlebar. Background pages suppress the broad shadow while retaining the exterior rim. `.artifact-frame-clip > :is(iframe, webview)` fills the document area through the one-pixel padding track. `.artifact-frame-clip` clips the document and titlebar while the outer frame lets both shadows extend outward. `.artifact-title-bar` paints the lower band, `.artifact-title-bar .artifact-title` takes the remaining width and truncates, and `.artifact-bar-divider` separates navigation from the menu trigger. The two direction buttons use `disabled` to show unavailable history. The document repeats the top clipping radius where required for composited iframe/webview rendering.
806
803
 
807
804
  The artifact menu uses the same shared menu elements and placement as channel menus. Deletion uses the shared dialog outline below.
808
805
 
@@ -860,15 +857,17 @@ The reusable copy control is `button.copy-button[size="sm"][prompt]`, optionally
860
857
  ```html
861
858
  <div class="dialog-overlay">
862
859
  <dialog open>
860
+ <div class="dialog-content">
863
861
  <div class="dialog-alert" role="alertdialog">
864
862
  <h2>…</h2><p>…</p>
865
863
  <div class="dialog-actions"><button>Cancel</button><button intent="danger">…</button></div>
866
864
  </div>
865
+ </div>
867
866
  </dialog>
868
867
  </div>
869
868
  ```
870
869
 
871
- The dialog may contain ordinary content instead of an alert. Ambient selectors `:where(.dialog-overlay)`, `:where(dialog)`, and `:where(dialog:focus-visible)` define dimming, centering, panel chrome and container focus treatment. `:where(.dialog-alert)`, `:where(.dialog-alert h2)`, `:where(.dialog-alert p)`, and `:where(.dialog-actions)` define the shared confirmation interior. Keep the modal input boundary and focus behavior intact.
870
+ The scrolling `.dialog-content` wrapper may contain ordinary content instead of an alert. Ambient selectors `:where(.dialog-overlay)`, `:where(dialog)`, and `:where(dialog:focus-visible)` define dimming, centering, panel chrome and container focus treatment. `:where(.dialog-alert)`, `:where(.dialog-alert h2)`, `:where(.dialog-alert p)`, and `:where(.dialog-actions)` define the shared confirmation interior. Keep the modal input boundary and focus behavior intact.
872
871
 
873
872
  Connection and authorization states reuse the dialog with `.system-modal`: an icon, heading and optional supporting paragraph. `.system-modal h2` and `.system-modal p:not(.tv-error)` set their hierarchy. Connecting and disconnected states use a spinning `tv-icon`; an error adds `.system-modal .server-url`. Authorization uses `form.system-modal.auth-form`. The field uses shared native-input styling; `.auth-form .auth-token` and `.auth-form .auth-submit` stretch the field and submit control. Rejection adds `aria-invalid="true"` and associates the shared error paragraph through `aria-describedby`; the alert communicates the failure. The rejected state is:
874
873
 
@@ -884,7 +883,7 @@ Connection and authorization states reuse the dialog with `.system-modal`: an ic
884
883
 
885
884
  The ordinary authorization state omits the invalid attribute, error association and error paragraph.
886
885
 
887
- Upgrade instructions use `.desktop-upgrade-gate > .dialog-overlay > dialog > .upgrade-gate-body`. The gate fills the halted page; the body scrolls within the panel. `.upgrade-gate-body h1`, `.upgrade-gate-body p`, `.upgrade-gate-body pre`, and `.upgrade-gate-body :last-child` restore local reading rhythm and command formatting.
886
+ Upgrade instructions use `.desktop-upgrade-gate > .dialog-overlay > dialog > .dialog-content > .upgrade-gate-body`. The gate fills the halted page; the body scrolls within the panel. `.upgrade-gate-body h1`, `.upgrade-gate-body p`, `.upgrade-gate-body pre`, and `.upgrade-gate-body :last-child` restore local reading rhythm and command formatting.
888
887
 
889
888
  ### Standalone artifact error documents
890
889
 
@@ -901,7 +900,7 @@ Upgrade instructions use `.desktop-upgrade-gate > .dialog-overlay > dialog > .up
901
900
 
902
901
  ## Panels and surface edges
903
902
 
904
- Popovers, including menus and select option lists, and dialogs share a light inner border and dark outer outline. Artifact frames, the sidebar and selected tabs reuse this treatment. Ordinary buttons and text fields use a simple border. The catalog provides the corresponding component overrides. Decorative outlines must leave keyboard focus visible.
903
+ Popovers, menus, select option lists, dialogs, artifact frames and the sidebar divider consume `--panel-edge-highlight` (a complete gradient) and `--panel-edge-shadow` (a complete sharp shadow). Set both to `none` to disable the decoration. Broad shadows are independent: `--artifact-frame-shadow` defaults to `var(--shadow-xl)` and either accepts `none` without erasing the rim. `--panel-border` defaults to `none`; frame and sidebar borders inherit it and accept explicit overrides. Ordinary buttons, text fields, separators and keyboard focus retain their own borders and outlines.
905
904
 
906
905
  ## Interaction feedback
907
906