@bnhf/prismcast 1.3.4-2026.2.19
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/LICENSE.md +7 -0
- package/README.md +347 -0
- package/bin/prismcast +6 -0
- package/dist/app.d.ts +6 -0
- package/dist/app.js +315 -0
- package/dist/app.js.map +1 -0
- package/dist/browser/cdp.d.ts +38 -0
- package/dist/browser/cdp.js +155 -0
- package/dist/browser/cdp.js.map +1 -0
- package/dist/browser/channelSelection.d.ts +65 -0
- package/dist/browser/channelSelection.js +202 -0
- package/dist/browser/channelSelection.js.map +1 -0
- package/dist/browser/display.d.ts +34 -0
- package/dist/browser/display.js +54 -0
- package/dist/browser/display.js.map +1 -0
- package/dist/browser/index.d.ts +205 -0
- package/dist/browser/index.js +1205 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/tuning/fox.d.ts +2 -0
- package/dist/browser/tuning/fox.js +83 -0
- package/dist/browser/tuning/fox.js.map +1 -0
- package/dist/browser/tuning/hbo.d.ts +2 -0
- package/dist/browser/tuning/hbo.js +237 -0
- package/dist/browser/tuning/hbo.js.map +1 -0
- package/dist/browser/tuning/hulu.d.ts +2 -0
- package/dist/browser/tuning/hulu.js +550 -0
- package/dist/browser/tuning/hulu.js.map +1 -0
- package/dist/browser/tuning/sling.d.ts +2 -0
- package/dist/browser/tuning/sling.js +518 -0
- package/dist/browser/tuning/sling.js.map +1 -0
- package/dist/browser/tuning/thumbnailRow.d.ts +2 -0
- package/dist/browser/tuning/thumbnailRow.js +108 -0
- package/dist/browser/tuning/thumbnailRow.js.map +1 -0
- package/dist/browser/tuning/tileClick.d.ts +2 -0
- package/dist/browser/tuning/tileClick.js +103 -0
- package/dist/browser/tuning/tileClick.js.map +1 -0
- package/dist/browser/tuning/youtubeTv.d.ts +2 -0
- package/dist/browser/tuning/youtubeTv.js +182 -0
- package/dist/browser/tuning/youtubeTv.js.map +1 -0
- package/dist/browser/video.d.ts +289 -0
- package/dist/browser/video.js +996 -0
- package/dist/browser/video.js.map +1 -0
- package/dist/channels/index.d.ts +3 -0
- package/dist/channels/index.js +392 -0
- package/dist/channels/index.js.map +1 -0
- package/dist/config/index.d.ts +53 -0
- package/dist/config/index.js +233 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/presets.d.ts +98 -0
- package/dist/config/presets.js +241 -0
- package/dist/config/presets.js.map +1 -0
- package/dist/config/profiles.d.ts +79 -0
- package/dist/config/profiles.js +245 -0
- package/dist/config/profiles.js.map +1 -0
- package/dist/config/providers.d.ts +120 -0
- package/dist/config/providers.js +450 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/sites.d.ts +22 -0
- package/dist/config/sites.js +377 -0
- package/dist/config/sites.js.map +1 -0
- package/dist/config/userChannels.d.ts +178 -0
- package/dist/config/userChannels.js +543 -0
- package/dist/config/userChannels.js.map +1 -0
- package/dist/config/userConfig.d.ts +235 -0
- package/dist/config/userConfig.js +913 -0
- package/dist/config/userConfig.js.map +1 -0
- package/dist/hdhr/channelMap.d.ts +21 -0
- package/dist/hdhr/channelMap.js +82 -0
- package/dist/hdhr/channelMap.js.map +1 -0
- package/dist/hdhr/deviceId.d.ts +11 -0
- package/dist/hdhr/deviceId.js +84 -0
- package/dist/hdhr/deviceId.js.map +1 -0
- package/dist/hdhr/discover.d.ts +6 -0
- package/dist/hdhr/discover.js +155 -0
- package/dist/hdhr/discover.js.map +1 -0
- package/dist/hdhr/index.d.ts +9 -0
- package/dist/hdhr/index.js +87 -0
- package/dist/hdhr/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +144 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/assets.d.ts +6 -0
- package/dist/routes/assets.js +79 -0
- package/dist/routes/assets.js.map +1 -0
- package/dist/routes/auth.d.ts +6 -0
- package/dist/routes/auth.js +77 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/channels.d.ts +6 -0
- package/dist/routes/channels.js +40 -0
- package/dist/routes/channels.js.map +1 -0
- package/dist/routes/components.d.ts +138 -0
- package/dist/routes/components.js +210 -0
- package/dist/routes/components.js.map +1 -0
- package/dist/routes/config.d.ts +72 -0
- package/dist/routes/config.js +1977 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/debug.d.ts +6 -0
- package/dist/routes/debug.js +274 -0
- package/dist/routes/debug.js.map +1 -0
- package/dist/routes/health.d.ts +6 -0
- package/dist/routes/health.js +85 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/hls.d.ts +6 -0
- package/dist/routes/hls.js +25 -0
- package/dist/routes/hls.js.map +1 -0
- package/dist/routes/index.d.ts +19 -0
- package/dist/routes/index.js +49 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/logs.d.ts +6 -0
- package/dist/routes/logs.js +164 -0
- package/dist/routes/logs.js.map +1 -0
- package/dist/routes/mpegts.d.ts +6 -0
- package/dist/routes/mpegts.js +19 -0
- package/dist/routes/mpegts.js.map +1 -0
- package/dist/routes/play.d.ts +6 -0
- package/dist/routes/play.js +18 -0
- package/dist/routes/play.js.map +1 -0
- package/dist/routes/playlist.d.ts +36 -0
- package/dist/routes/playlist.js +134 -0
- package/dist/routes/playlist.js.map +1 -0
- package/dist/routes/root.d.ts +6 -0
- package/dist/routes/root.js +2920 -0
- package/dist/routes/root.js.map +1 -0
- package/dist/routes/streams.d.ts +6 -0
- package/dist/routes/streams.js +88 -0
- package/dist/routes/streams.js.map +1 -0
- package/dist/routes/theme.d.ts +15 -0
- package/dist/routes/theme.js +275 -0
- package/dist/routes/theme.js.map +1 -0
- package/dist/routes/ui.d.ts +56 -0
- package/dist/routes/ui.js +354 -0
- package/dist/routes/ui.js.map +1 -0
- package/dist/service/commands.d.ts +41 -0
- package/dist/service/commands.js +391 -0
- package/dist/service/commands.js.map +1 -0
- package/dist/service/generators.d.ts +33 -0
- package/dist/service/generators.js +432 -0
- package/dist/service/generators.js.map +1 -0
- package/dist/service/index.d.ts +2 -0
- package/dist/service/index.js +7 -0
- package/dist/service/index.js.map +1 -0
- package/dist/streaming/clients.d.ts +48 -0
- package/dist/streaming/clients.js +114 -0
- package/dist/streaming/clients.js.map +1 -0
- package/dist/streaming/fmp4Segmenter.d.ts +61 -0
- package/dist/streaming/fmp4Segmenter.js +461 -0
- package/dist/streaming/fmp4Segmenter.js.map +1 -0
- package/dist/streaming/hls.d.ts +120 -0
- package/dist/streaming/hls.js +722 -0
- package/dist/streaming/hls.js.map +1 -0
- package/dist/streaming/hlsSegments.d.ts +54 -0
- package/dist/streaming/hlsSegments.js +162 -0
- package/dist/streaming/hlsSegments.js.map +1 -0
- package/dist/streaming/lifecycle.d.ts +33 -0
- package/dist/streaming/lifecycle.js +185 -0
- package/dist/streaming/lifecycle.js.map +1 -0
- package/dist/streaming/monitor.d.ts +74 -0
- package/dist/streaming/monitor.js +1310 -0
- package/dist/streaming/monitor.js.map +1 -0
- package/dist/streaming/mp4Parser.d.ts +74 -0
- package/dist/streaming/mp4Parser.js +566 -0
- package/dist/streaming/mp4Parser.js.map +1 -0
- package/dist/streaming/mpegts.d.ts +14 -0
- package/dist/streaming/mpegts.js +248 -0
- package/dist/streaming/mpegts.js.map +1 -0
- package/dist/streaming/registry.d.ts +119 -0
- package/dist/streaming/registry.js +127 -0
- package/dist/streaming/registry.js.map +1 -0
- package/dist/streaming/setup.d.ts +135 -0
- package/dist/streaming/setup.js +670 -0
- package/dist/streaming/setup.js.map +1 -0
- package/dist/streaming/showInfo.d.ts +30 -0
- package/dist/streaming/showInfo.js +362 -0
- package/dist/streaming/showInfo.js.map +1 -0
- package/dist/streaming/statusEmitter.d.ts +125 -0
- package/dist/streaming/statusEmitter.js +139 -0
- package/dist/streaming/statusEmitter.js.map +1 -0
- package/dist/types/index.d.ts +403 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/debugFilter.d.ts +38 -0
- package/dist/utils/debugFilter.js +157 -0
- package/dist/utils/debugFilter.js.map +1 -0
- package/dist/utils/delay.d.ts +6 -0
- package/dist/utils/delay.js +15 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/errors.d.ts +15 -0
- package/dist/utils/errors.js +40 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/evaluate.d.ts +51 -0
- package/dist/utils/evaluate.js +124 -0
- package/dist/utils/evaluate.js.map +1 -0
- package/dist/utils/ffmpeg.d.ts +65 -0
- package/dist/utils/ffmpeg.js +317 -0
- package/dist/utils/ffmpeg.js.map +1 -0
- package/dist/utils/fileLogger.d.ts +25 -0
- package/dist/utils/fileLogger.js +248 -0
- package/dist/utils/fileLogger.js.map +1 -0
- package/dist/utils/format.d.ts +16 -0
- package/dist/utils/format.js +46 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/html.d.ts +6 -0
- package/dist/utils/html.js +24 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/index.d.ts +15 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logEmitter.d.ts +17 -0
- package/dist/utils/logEmitter.js +30 -0
- package/dist/utils/logEmitter.js.map +1 -0
- package/dist/utils/logger.d.ts +82 -0
- package/dist/utils/logger.js +219 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/m3u.d.ts +32 -0
- package/dist/utils/m3u.js +148 -0
- package/dist/utils/m3u.js.map +1 -0
- package/dist/utils/morganStream.d.ts +7 -0
- package/dist/utils/morganStream.js +33 -0
- package/dist/utils/morganStream.js.map +1 -0
- package/dist/utils/platform.d.ts +64 -0
- package/dist/utils/platform.js +157 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/retry.d.ts +15 -0
- package/dist/utils/retry.js +82 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/streamContext.d.ts +28 -0
- package/dist/utils/streamContext.js +33 -0
- package/dist/utils/streamContext.js.map +1 -0
- package/dist/utils/version.d.ts +37 -0
- package/dist/utils/version.js +228 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +92 -0
- package/prismcast.png +0 -0
- package/prismcast.svg +74 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
|
+
*
|
|
3
|
+
* ui.ts: Shared UI components and utilities for PrismCast web pages.
|
|
4
|
+
*/
|
|
5
|
+
import { generateThemeStyles } from "./theme.js";
|
|
6
|
+
/* This module provides reusable UI components used across PrismCast web pages. It ensures consistent styling and behavior between the landing page and
|
|
7
|
+
* configuration page by extracting common CSS and JavaScript patterns. All styles use CSS custom properties from theme.ts for automatic dark mode support.
|
|
8
|
+
*/
|
|
9
|
+
// Re-export components for convenience.
|
|
10
|
+
export { generateAlert, generateBadge, generateButton, generateCodeBlock, generatePanelHeader, generateSection, generateSelect, generateSimpleAlert, generateStatusIndicator, generateTextInput } from "./components.js";
|
|
11
|
+
/**
|
|
12
|
+
* Generates the base CSS styles shared across PrismCast pages. These styles provide consistent typography, layout, and basic component styling using CSS custom
|
|
13
|
+
* properties for theme support.
|
|
14
|
+
* @returns CSS styles as a string.
|
|
15
|
+
*/
|
|
16
|
+
export function generateBaseStyles() {
|
|
17
|
+
return [
|
|
18
|
+
// Base styles.
|
|
19
|
+
"body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; max-width: 2000px; margin: 40px auto; padding: 0 20px; ",
|
|
20
|
+
"line-height: 1.6; color: var(--text-primary); background: var(--surface-page); }",
|
|
21
|
+
"h1 { color: var(--text-heading); border-bottom: 2px solid var(--interactive-primary); padding-bottom: 10px; }",
|
|
22
|
+
"h2 { color: var(--text-heading-secondary); margin-top: 0; margin-bottom: 20px; }",
|
|
23
|
+
"h3 { color: var(--text-heading-secondary); margin-top: 25px; margin-bottom: 15px; }",
|
|
24
|
+
// Link styles.
|
|
25
|
+
"a { color: var(--interactive-primary); text-decoration: none; }",
|
|
26
|
+
"a:hover { text-decoration: underline; }",
|
|
27
|
+
// Code styles.
|
|
28
|
+
"code { background: var(--surface-code); padding: 2px 6px; border-radius: var(--radius-sm); font-family: 'SF Mono', Monaco, monospace; }",
|
|
29
|
+
"pre { background: var(--surface-pre); padding: 15px; border-radius: var(--radius-lg); overflow-x: auto; border: 1px solid var(--border-default); ",
|
|
30
|
+
"font-size: 13px; margin: 15px 0; }",
|
|
31
|
+
// Table styles.
|
|
32
|
+
"table { border-collapse: collapse; width: 100%; margin: 15px 0; }",
|
|
33
|
+
"th, td { text-align: left; padding: 10px 12px; border: 1px solid var(--border-default); }",
|
|
34
|
+
"th { background: var(--table-header-bg); font-weight: 600; }",
|
|
35
|
+
"tr:nth-child(even) { background: var(--table-row-even); }",
|
|
36
|
+
// Header styles.
|
|
37
|
+
".header { display: flex; align-items: center; gap: 20px; border-bottom: 2px solid var(--interactive-primary); padding-bottom: 15px; margin-bottom: 20px; }",
|
|
38
|
+
".logo { height: 80px; width: auto; }",
|
|
39
|
+
".header h1 { border-bottom: none; padding-bottom: 0; margin: 0; }",
|
|
40
|
+
// Section styles.
|
|
41
|
+
".section { margin-bottom: 30px; }",
|
|
42
|
+
// Alert styles (unified for success, error, warning).
|
|
43
|
+
".alert { padding: 15px; border-radius: var(--radius-lg); margin-bottom: 20px; }",
|
|
44
|
+
".alert-title { font-weight: bold; margin-bottom: 5px; }",
|
|
45
|
+
".alert-success, .success { background: var(--status-success-bg); border: 1px solid var(--status-success-border); }",
|
|
46
|
+
".alert-success .alert-title, .success-title { color: var(--status-success-text); }",
|
|
47
|
+
".alert-error, .error { background: var(--status-error-bg); border: 1px solid var(--status-error-border); }",
|
|
48
|
+
".alert-error .alert-title, .error-title { color: var(--status-error-text); }",
|
|
49
|
+
".alert-warning, .warning { background: var(--status-warning-bg); border: 1px solid var(--status-warning-border); }",
|
|
50
|
+
".alert-warning .alert-title, .warning-title { color: var(--status-warning-text); }",
|
|
51
|
+
// Button styles.
|
|
52
|
+
".btn { padding: 10px 20px; border: none; border-radius: var(--radius-lg); cursor: pointer; font-size: 14px; font-weight: 500; ",
|
|
53
|
+
"transition: background-color 0.2s; }",
|
|
54
|
+
".btn-primary { background: var(--interactive-primary); color: var(--text-inverse); }",
|
|
55
|
+
".btn-primary:hover { background: var(--interactive-primary-hover); }",
|
|
56
|
+
".btn-secondary { background: var(--interactive-secondary); color: var(--text-inverse); }",
|
|
57
|
+
".btn-secondary:hover { background: var(--interactive-secondary-hover); }",
|
|
58
|
+
".btn-danger { background: var(--interactive-danger); color: var(--text-inverse); }",
|
|
59
|
+
".btn-danger:hover { background: var(--interactive-danger-hover); }",
|
|
60
|
+
".btn-edit { background: var(--interactive-edit); color: var(--text-inverse); }",
|
|
61
|
+
".btn-edit:hover { background: var(--interactive-edit-hover); }",
|
|
62
|
+
".btn-delete { background: var(--interactive-delete); color: var(--text-inverse); }",
|
|
63
|
+
".btn-delete:hover { background: var(--interactive-delete-hover); }",
|
|
64
|
+
".btn-group { display: flex; gap: 6px; }",
|
|
65
|
+
".btn-sm { padding: 6px 12px; font-size: 12px; white-space: nowrap; }",
|
|
66
|
+
".btn:disabled { opacity: 0.6; cursor: not-allowed; }",
|
|
67
|
+
// Badge styles.
|
|
68
|
+
".badge { display: inline-block; padding: 3px 8px; border-radius: var(--radius-sm); font-size: 11px; font-weight: 600; }",
|
|
69
|
+
".badge-builtin { background: var(--badge-builtin-bg); color: var(--badge-builtin-text); }",
|
|
70
|
+
".badge-custom { background: var(--badge-custom-bg); color: var(--badge-custom-text); }",
|
|
71
|
+
".badge-override { background: var(--badge-override-bg); color: var(--badge-override-text); }",
|
|
72
|
+
".badge-env { background: var(--badge-env-bg); color: var(--badge-env-text); }",
|
|
73
|
+
".badge-flag { background: var(--badge-flag-bg); color: var(--badge-flag-text); }",
|
|
74
|
+
// Status indicator styles.
|
|
75
|
+
".status-indicator { white-space: nowrap; }",
|
|
76
|
+
".status-dot { margin-right: 4px; }",
|
|
77
|
+
".status-healthy .status-dot { color: var(--stream-healthy); }",
|
|
78
|
+
".status-buffering .status-dot { color: var(--stream-buffering); }",
|
|
79
|
+
".status-recovering .status-dot { color: var(--stream-recovering); }",
|
|
80
|
+
".status-stalled .status-dot { color: var(--stream-stalled); }",
|
|
81
|
+
".status-error .status-dot { color: var(--stream-error); }",
|
|
82
|
+
// Form styles.
|
|
83
|
+
".form-group { margin-bottom: 20px; padding: 15px; background: var(--form-bg); border-radius: var(--radius-lg); }",
|
|
84
|
+
".form-group.disabled { background: var(--form-bg-disabled); }",
|
|
85
|
+
".form-group.depends-disabled { opacity: 0.45; pointer-events: none; }",
|
|
86
|
+
".form-row { display: flex; align-items: center; gap: 15px; margin-bottom: 8px; }",
|
|
87
|
+
".form-row label { display: block; font-weight: 600; margin-bottom: 5px; font-size: 13px; }",
|
|
88
|
+
".form-label { font-weight: 600; min-width: 200px; }",
|
|
89
|
+
// Base input and select styles. Uses class selectors only for predictable specificity. All form inputs should use the .form-input class, and all form selects
|
|
90
|
+
// should use the .form-select class.
|
|
91
|
+
".form-input { flex: 1; padding: 8px 12px; border: 1px solid var(--form-input-border); border-radius: var(--radius-md); font-size: 14px; ",
|
|
92
|
+
"background: var(--form-input-bg); color: var(--text-primary); }",
|
|
93
|
+
".form-select { flex: 0 0 auto; padding: 8px 12px; border: 1px solid var(--form-input-border); border-radius: var(--radius-md); ",
|
|
94
|
+
"background: var(--form-input-bg); color: var(--text-primary); font-size: 14px; cursor: pointer; }",
|
|
95
|
+
".form-checkbox { flex: none; width: 18px; height: 18px; cursor: pointer; accent-color: var(--interactive-primary); }",
|
|
96
|
+
// Focus states.
|
|
97
|
+
".form-input:focus, .form-select:focus { border-color: var(--interactive-primary); outline: none; box-shadow: 0 0 0 2px var(--border-focus); }",
|
|
98
|
+
// Disabled states.
|
|
99
|
+
".form-input:disabled, .form-select:disabled { background: var(--form-bg-disabled); cursor: not-allowed; color: var(--text-disabled); }",
|
|
100
|
+
".form-checkbox:disabled { cursor: not-allowed; opacity: 0.5; }",
|
|
101
|
+
// Error states.
|
|
102
|
+
".form-input.error, .form-select.error { border-color: var(--status-error-border); background: var(--status-error-bg); }",
|
|
103
|
+
// Field width classes using compound selectors for sufficient specificity to override the base flex: 1 rule. Inputs use fixed widths for predictable numeric
|
|
104
|
+
// content. Selects use min-width to ensure minimum sizing while allowing growth for longer option text.
|
|
105
|
+
".form-input.field-narrow { flex: none; width: 55px; }",
|
|
106
|
+
".form-input.field-medium { flex: none; width: 100px; }",
|
|
107
|
+
".form-input.field-wide { flex: none; width: 200px; }",
|
|
108
|
+
".form-select.field-narrow { flex: 0 0 auto; min-width: 55px; }",
|
|
109
|
+
".form-select.field-medium { flex: 0 0 auto; min-width: 100px; }",
|
|
110
|
+
".form-select.field-wide { flex: 0 0 auto; min-width: 200px; }",
|
|
111
|
+
// Form metadata styles.
|
|
112
|
+
".form-unit { color: var(--text-secondary); font-size: 13px; min-width: 40px; }",
|
|
113
|
+
".form-description { color: var(--text-secondary); font-size: 13px; margin-top: 5px; }",
|
|
114
|
+
".form-default { color: var(--text-muted); font-size: 12px; margin-top: 3px; }",
|
|
115
|
+
".form-env { color: var(--status-warning-text); font-size: 12px; margin-top: 3px; font-style: italic; }",
|
|
116
|
+
".form-error { color: var(--status-error-text); font-size: 12px; margin-top: 3px; }",
|
|
117
|
+
".form-warning { color: var(--status-warning-text); font-size: 12px; margin-top: 5px; padding: 6px 10px; background: var(--status-warning-bg); ",
|
|
118
|
+
"border-radius: var(--radius-sm); }",
|
|
119
|
+
".hint { color: var(--text-secondary); font-size: 12px; margin-top: 1px; margin-bottom: 15px; }",
|
|
120
|
+
// Env badge in form labels.
|
|
121
|
+
".env-badge { display: inline-block; background: var(--badge-env-bg); color: var(--badge-env-text); padding: 2px 8px; ",
|
|
122
|
+
"border-radius: var(--radius-sm); font-size: 11px; font-weight: 600; margin-left: 10px; }",
|
|
123
|
+
// Button row.
|
|
124
|
+
".button-row { margin-top: 30px; padding: 20px 0; border-top: 1px solid var(--border-default); display: flex; gap: 15px; }",
|
|
125
|
+
".form-buttons { display: flex; gap: 10px; margin-top: 20px; }",
|
|
126
|
+
// Config path display.
|
|
127
|
+
".config-path { margin-top: 20px; padding-top: 15px; border-top: 1px solid var(--border-default); font-size: 13px; color: var(--text-secondary); }",
|
|
128
|
+
// Panel header.
|
|
129
|
+
".panel-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding-bottom: 15px; ",
|
|
130
|
+
"border-bottom: 1px solid var(--border-light); }",
|
|
131
|
+
".panel-reset { font-size: 13px; }",
|
|
132
|
+
// Collapsible sections for Advanced tab.
|
|
133
|
+
".advanced-section { margin-bottom: 16px; border: 1px solid var(--border-default); border-radius: var(--radius-lg); overflow: hidden; }",
|
|
134
|
+
".section-header { display: flex; align-items: center; padding: 14px 18px; cursor: pointer; background: var(--surface-elevated); ",
|
|
135
|
+
"transition: background 0.15s; user-select: none; }",
|
|
136
|
+
".section-header:hover { background: var(--surface-code); }",
|
|
137
|
+
".section-chevron { margin-right: 12px; font-size: 10px; color: var(--text-secondary); transition: transform 0.2s; }",
|
|
138
|
+
".section-header.expanded .section-chevron { transform: rotate(90deg); }",
|
|
139
|
+
".section-title { font-weight: 600; font-size: 14px; color: var(--text-primary); }",
|
|
140
|
+
".section-count { margin-left: 10px; color: var(--text-muted); font-size: 13px; font-weight: normal; }",
|
|
141
|
+
".section-content { display: none; padding: 20px; border-top: 1px solid var(--border-default); background: var(--surface-page); }",
|
|
142
|
+
".section-content.expanded { display: block; }",
|
|
143
|
+
".section-content .form-group:last-child { margin-bottom: 0; }",
|
|
144
|
+
// Non-collapsible sections for Settings tab.
|
|
145
|
+
".settings-section { margin-bottom: 28px; }",
|
|
146
|
+
".settings-section:last-child { margin-bottom: 0; }",
|
|
147
|
+
".settings-section-header { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--text-secondary); ",
|
|
148
|
+
"margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--border-light); }"
|
|
149
|
+
].join("\n");
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Generates the CSS styles for the tabbed interface. These styles provide the tab bar, tab buttons, and panel containers.
|
|
153
|
+
* @returns CSS styles as a string.
|
|
154
|
+
*/
|
|
155
|
+
export function generateTabStyles() {
|
|
156
|
+
return [
|
|
157
|
+
// Tab bar container.
|
|
158
|
+
".tab-bar { display: flex; border-bottom: 2px solid var(--tab-border); margin-bottom: 0; gap: 4px; flex-wrap: wrap; }",
|
|
159
|
+
// Tab buttons.
|
|
160
|
+
".tab-btn { padding: 12px 20px; border: none; background: var(--tab-bg); cursor: pointer; font-size: 14px; font-weight: 500; color: var(--tab-text); ",
|
|
161
|
+
"border-radius: var(--radius-lg) var(--radius-lg) 0 0; transition: all 0.2s; position: relative; top: 2px; }",
|
|
162
|
+
".tab-btn:hover { background: var(--tab-bg-hover); color: var(--tab-text-hover); }",
|
|
163
|
+
".tab-btn.active { background: var(--tab-bg-active); color: var(--tab-text-active); border: 2px solid var(--tab-border); ",
|
|
164
|
+
"border-bottom: 2px solid var(--tab-bg-active); }",
|
|
165
|
+
".tab-btn.has-error { color: var(--tab-error); }",
|
|
166
|
+
".tab-btn.has-error.active { color: var(--tab-error); }",
|
|
167
|
+
// Tab panels.
|
|
168
|
+
".tab-panel { display: none; padding: 25px; border: 2px solid var(--tab-border); border-top: none; border-radius: 0 0 var(--radius-lg) var(--radius-lg); ",
|
|
169
|
+
"background: var(--surface-page); }",
|
|
170
|
+
".tab-panel.active { display: block; }"
|
|
171
|
+
].join("\n");
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Generates the JavaScript for tab switching functionality. This script handles click events on tab buttons, keyboard navigation, hash-based URL navigation,
|
|
175
|
+
* and localStorage persistence of the selected tab.
|
|
176
|
+
* @param options - Configuration options for the tab script.
|
|
177
|
+
* @returns JavaScript code as a string wrapped in script tags.
|
|
178
|
+
*/
|
|
179
|
+
export function generateTabScript(options = {}) {
|
|
180
|
+
const { hideElementOnTab, localStorageKey = "prismcast-tab" } = options;
|
|
181
|
+
const hideLogic = hideElementOnTab ?
|
|
182
|
+
" if(hideElement) {\n hideElement.style.display = (category === '" + hideElementOnTab.tabName + "') ? 'none' : 'flex';\n }" :
|
|
183
|
+
"";
|
|
184
|
+
const hideElementSelector = hideElementOnTab ?
|
|
185
|
+
" var hideElement = document.getElementById('" + hideElementOnTab.elementId + "');\n" :
|
|
186
|
+
"";
|
|
187
|
+
return [
|
|
188
|
+
"<script>",
|
|
189
|
+
"(function() {",
|
|
190
|
+
// Parse hash to extract main tab and optional subtab.
|
|
191
|
+
" function parseHash() {",
|
|
192
|
+
" var hash = window.location.hash.slice(1);",
|
|
193
|
+
" if(!hash) return { tab: null, subtab: null };",
|
|
194
|
+
" var parts = hash.split('/');",
|
|
195
|
+
" return { tab: parts[0] || null, subtab: parts[1] || null };",
|
|
196
|
+
" }",
|
|
197
|
+
// Update URL hash without triggering hashchange handler.
|
|
198
|
+
" var updatingHash = false;",
|
|
199
|
+
" function updateHash(tab, subtab) {",
|
|
200
|
+
" updatingHash = true;",
|
|
201
|
+
" var newHash = '#' + tab + (subtab ? '/' + subtab : '');",
|
|
202
|
+
" if(window.location.hash !== newHash) {",
|
|
203
|
+
" window.location.hash = newHash;",
|
|
204
|
+
" }",
|
|
205
|
+
" setTimeout(function() { updatingHash = false; }, 0);",
|
|
206
|
+
" }",
|
|
207
|
+
// Tab switching function.
|
|
208
|
+
" function switchTab(category, updateUrl) {",
|
|
209
|
+
" var tabs = document.querySelectorAll('.tab-btn');",
|
|
210
|
+
" var panels = document.querySelectorAll('.tab-panel');",
|
|
211
|
+
hideElementSelector,
|
|
212
|
+
" for(var i = 0; i < tabs.length; i++) {",
|
|
213
|
+
" tabs[i].classList.remove('active');",
|
|
214
|
+
" tabs[i].setAttribute('aria-selected', 'false');",
|
|
215
|
+
" tabs[i].setAttribute('tabindex', '-1');",
|
|
216
|
+
" if(tabs[i].getAttribute('data-category') === category) {",
|
|
217
|
+
" tabs[i].classList.add('active');",
|
|
218
|
+
" tabs[i].setAttribute('aria-selected', 'true');",
|
|
219
|
+
" tabs[i].setAttribute('tabindex', '0');",
|
|
220
|
+
" }",
|
|
221
|
+
" }",
|
|
222
|
+
" for(var j = 0; j < panels.length; j++) {",
|
|
223
|
+
" panels[j].classList.remove('active');",
|
|
224
|
+
" if(panels[j].id === 'panel-' + category) {",
|
|
225
|
+
" panels[j].classList.add('active');",
|
|
226
|
+
" }",
|
|
227
|
+
" }",
|
|
228
|
+
hideLogic,
|
|
229
|
+
" try { localStorage.setItem('" + localStorageKey + "', category); } catch(e) {}",
|
|
230
|
+
" if(updateUrl !== false) {",
|
|
231
|
+
" var parsed = parseHash();",
|
|
232
|
+
" var subtab = (category === 'config') ? parsed.subtab : null;",
|
|
233
|
+
" updateHash(category, subtab);",
|
|
234
|
+
" }",
|
|
235
|
+
" document.dispatchEvent(new CustomEvent('tabactivated', { detail: { category: category } }));",
|
|
236
|
+
" }",
|
|
237
|
+
// Expose switchTab globally for subtab script to use.
|
|
238
|
+
" window.switchMainTab = switchTab;",
|
|
239
|
+
// Attach click handlers to tabs.
|
|
240
|
+
" var tabBtns = document.querySelectorAll('.tab-btn');",
|
|
241
|
+
" for(var i = 0; i < tabBtns.length; i++) {",
|
|
242
|
+
" tabBtns[i].addEventListener('click', function() {",
|
|
243
|
+
" switchTab(this.getAttribute('data-category'));",
|
|
244
|
+
" });",
|
|
245
|
+
" }",
|
|
246
|
+
// Keyboard navigation for tabs.
|
|
247
|
+
" var tabBar = document.querySelector('.tab-bar');",
|
|
248
|
+
" if(tabBar) {",
|
|
249
|
+
" tabBar.addEventListener('keydown', function(e) {",
|
|
250
|
+
" if(e.key === 'ArrowRight' || e.key === 'ArrowLeft') {",
|
|
251
|
+
" var tabs = Array.prototype.slice.call(document.querySelectorAll('.tab-btn'));",
|
|
252
|
+
" var current = document.querySelector('.tab-btn.active');",
|
|
253
|
+
" var idx = tabs.indexOf(current);",
|
|
254
|
+
" if(e.key === 'ArrowRight') { idx = (idx + 1) % tabs.length; }",
|
|
255
|
+
" else { idx = (idx - 1 + tabs.length) % tabs.length; }",
|
|
256
|
+
" tabs[idx].focus();",
|
|
257
|
+
" switchTab(tabs[idx].getAttribute('data-category'));",
|
|
258
|
+
" }",
|
|
259
|
+
" });",
|
|
260
|
+
" }",
|
|
261
|
+
// Handle browser back/forward navigation.
|
|
262
|
+
" window.addEventListener('hashchange', function() {",
|
|
263
|
+
" if(updatingHash) return;",
|
|
264
|
+
" var parsed = parseHash();",
|
|
265
|
+
" if(parsed.tab && document.querySelector('.tab-btn[data-category=\"' + parsed.tab + '\"]')) {",
|
|
266
|
+
" switchTab(parsed.tab, false);",
|
|
267
|
+
" if(parsed.tab === 'config' && parsed.subtab && window.switchConfigSubtab) {",
|
|
268
|
+
" window.switchConfigSubtab(parsed.subtab, false);",
|
|
269
|
+
" }",
|
|
270
|
+
" }",
|
|
271
|
+
" });",
|
|
272
|
+
// Determine initial tab: hash > localStorage > default.
|
|
273
|
+
" var parsed = parseHash();",
|
|
274
|
+
" var initialTab = parsed.tab;",
|
|
275
|
+
" if(!initialTab) {",
|
|
276
|
+
" try { initialTab = localStorage.getItem('" + localStorageKey + "'); } catch(e) {}",
|
|
277
|
+
" }",
|
|
278
|
+
" if(initialTab && document.querySelector('.tab-btn[data-category=\"' + initialTab + '\"]')) {",
|
|
279
|
+
" switchTab(initialTab, !parsed.tab);",
|
|
280
|
+
" } else {",
|
|
281
|
+
" var activeTab = document.querySelector('.tab-btn.active');",
|
|
282
|
+
" if(activeTab) {",
|
|
283
|
+
" var category = activeTab.getAttribute('data-category');",
|
|
284
|
+
" if(!parsed.tab) updateHash(category, null);",
|
|
285
|
+
" document.dispatchEvent(new CustomEvent('tabactivated', { detail: { category: category } }));",
|
|
286
|
+
" }",
|
|
287
|
+
" }",
|
|
288
|
+
// Store parsed hash for subtab script to use.
|
|
289
|
+
" window.initialHashSubtab = parsed.subtab;",
|
|
290
|
+
"})();",
|
|
291
|
+
"</script>"
|
|
292
|
+
].join("\n");
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Generates a tab button HTML element.
|
|
296
|
+
* @param category - The category identifier for the tab.
|
|
297
|
+
* @param label - The display label for the tab.
|
|
298
|
+
* @param isActive - Whether this tab is initially active.
|
|
299
|
+
* @param hasError - Whether to show an error indicator on the tab.
|
|
300
|
+
* @returns HTML string for the tab button.
|
|
301
|
+
*/
|
|
302
|
+
export function generateTabButton(category, label, isActive, hasError = false) {
|
|
303
|
+
const activeClass = isActive ? " active" : "";
|
|
304
|
+
const errorClass = hasError ? " has-error" : "";
|
|
305
|
+
const ariaSelected = isActive ? "true" : "false";
|
|
306
|
+
const tabIndex = isActive ? "0" : "-1";
|
|
307
|
+
return "<button type=\"button\" class=\"tab-btn" + activeClass + errorClass + "\" data-category=\"" + category +
|
|
308
|
+
"\" role=\"tab\" aria-selected=\"" + ariaSelected + "\" aria-controls=\"panel-" + category + "\" tabindex=\"" + tabIndex + "\">" + label + "</button>";
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Generates a tab panel container HTML element.
|
|
312
|
+
* @param category - The category identifier for the panel.
|
|
313
|
+
* @param content - The HTML content of the panel.
|
|
314
|
+
* @param isActive - Whether this panel is initially visible.
|
|
315
|
+
* @returns HTML string for the tab panel.
|
|
316
|
+
*/
|
|
317
|
+
export function generateTabPanel(category, content, isActive) {
|
|
318
|
+
const activeClass = isActive ? " active" : "";
|
|
319
|
+
return "<div id=\"panel-" + category + "\" class=\"tab-panel" + activeClass + "\" role=\"tabpanel\">" + content + "</div>";
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Generates the common page wrapper HTML structure with head, styles, and body. Automatically includes theme styles for dark mode support.
|
|
323
|
+
* @param title - The page title.
|
|
324
|
+
* @param styles - CSS styles to include in the head.
|
|
325
|
+
* @param bodyContent - HTML content for the body.
|
|
326
|
+
* @param scripts - Optional JavaScript to include at the end of the body.
|
|
327
|
+
* @returns Complete HTML document string.
|
|
328
|
+
*/
|
|
329
|
+
export function generatePageWrapper(title, styles, bodyContent, scripts = "") {
|
|
330
|
+
// Theme styles must come first so other styles can reference CSS variables.
|
|
331
|
+
const allStyles = [generateThemeStyles(), styles].join("\n");
|
|
332
|
+
return [
|
|
333
|
+
"<!DOCTYPE html>",
|
|
334
|
+
"<html lang=\"en\">",
|
|
335
|
+
"<head>",
|
|
336
|
+
"<meta charset=\"UTF-8\">",
|
|
337
|
+
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">",
|
|
338
|
+
"<meta name=\"color-scheme\" content=\"light dark\">",
|
|
339
|
+
"<title>" + title + "</title>",
|
|
340
|
+
"<link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">",
|
|
341
|
+
"<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/favicon.png\">",
|
|
342
|
+
"<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"/logo.png\">",
|
|
343
|
+
"<style>",
|
|
344
|
+
allStyles,
|
|
345
|
+
"</style>",
|
|
346
|
+
"</head>",
|
|
347
|
+
"<body>",
|
|
348
|
+
bodyContent,
|
|
349
|
+
scripts,
|
|
350
|
+
"</body>",
|
|
351
|
+
"</html>"
|
|
352
|
+
].join("\n");
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/routes/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prints usage information for the service subcommand.
|
|
3
|
+
*/
|
|
4
|
+
export declare function printServiceUsage(): void;
|
|
5
|
+
/**
|
|
6
|
+
* Handles the `service install` command. Generates and installs a service file for the current platform, then starts the service.
|
|
7
|
+
* @param force - If true, reinstall even if already installed.
|
|
8
|
+
* @returns Exit code (0 for success, 1 for error).
|
|
9
|
+
*/
|
|
10
|
+
export declare function handleInstall(force: boolean): Promise<number>;
|
|
11
|
+
/**
|
|
12
|
+
* Handles the `service uninstall` command. Stops and removes the service.
|
|
13
|
+
* @returns Exit code (0 for success, 1 for error).
|
|
14
|
+
*/
|
|
15
|
+
export declare function handleUninstall(): Promise<number>;
|
|
16
|
+
/**
|
|
17
|
+
* Handles the `service start` command. Starts the service if it is installed but not running.
|
|
18
|
+
* @returns Exit code (0 for success, 1 for error).
|
|
19
|
+
*/
|
|
20
|
+
export declare function handleStart(): Promise<number>;
|
|
21
|
+
/**
|
|
22
|
+
* Handles the `service stop` command. Stops the service if it is running.
|
|
23
|
+
* @returns Exit code (0 for success, 1 for error).
|
|
24
|
+
*/
|
|
25
|
+
export declare function handleStop(): Promise<number>;
|
|
26
|
+
/**
|
|
27
|
+
* Handles the `service restart` command. Stops the service if running, then starts it.
|
|
28
|
+
* @returns Exit code (0 for success, 1 for error).
|
|
29
|
+
*/
|
|
30
|
+
export declare function handleRestart(): Promise<number>;
|
|
31
|
+
/**
|
|
32
|
+
* Handles the `service status` command. Shows the current service installation and running status.
|
|
33
|
+
* @returns Exit code (0 for success).
|
|
34
|
+
*/
|
|
35
|
+
export declare function handleStatus(): Promise<number>;
|
|
36
|
+
/**
|
|
37
|
+
* Main handler for the `service` subcommand. Parses arguments and delegates to the appropriate handler.
|
|
38
|
+
* @param args - Arguments after 'service' (e.g., ['install', '--force']).
|
|
39
|
+
* @returns Exit code (0 for success, 1 for error).
|
|
40
|
+
*/
|
|
41
|
+
export declare function handleServiceCommand(args: string[]): Promise<number>;
|