webring-rails 1.7.3 → 1.7.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f9d0c282d9c70f7496be14d07208be3200af7f781cab93ea45785e99ce99572e
4
- data.tar.gz: a708bacf75e46d7ca6c62edd65ded059f405afff09bb204fd72bfbbcb6a7e1b5
3
+ metadata.gz: 9d30b50a2cc8848f7a49cafe72e2584b48d0c851ba01d1fec429952c3953fa2c
4
+ data.tar.gz: 5cb60d1b09293f9b9b7fad19a4fc52219f3d0c8ee448fd7d5b2aef7f8f2a7b89
5
5
  SHA512:
6
- metadata.gz: d3f48e765f419b8e3b4189dd680de9e066a875d76aee3f3c195d867f918ee319460d69248aba07d5b773b31e8ac97045a79fc6df28fb41e978baec0cbcb1a852
7
- data.tar.gz: 6de9845eef922a65f7785a57b12595e81348a4d83428d678cadead421247e463e230dc2eb21580d7ebc65bfe76010c72cb1ca3bd1095f5ab97a237cdccdf3522
6
+ metadata.gz: c3390b11cbb9edd49dbe051026bba065f1aa9cacfb1fdbcda5c0170114cdd980a83ee61d05abf42a70a06e81361af2e90d2507748480f4e8af9d0cdfaed4d55c
7
+ data.tar.gz: dfe3554ee43383aed8c06bbf566026538aeacd6799a2f92476a841419ab451c9198dde85e246c2faba60ec99e1627f5871ddbacc48c62f7237834cd39a92b00b
@@ -76,7 +76,7 @@
76
76
  const NAVIGATION_ACTIONS = Object.freeze({
77
77
  prev: {
78
78
  symbol: '«',
79
- text: `« ${FULL_TEXT_DEFAULTS.prev.default}`,
79
+ text: FULL_TEXT_DEFAULTS.prev.default,
80
80
  text_enforced: FULL_TEXT_DEFAULTS.prev.enforced,
81
81
  title: 'Previous site',
82
82
  path: 'previous',
@@ -92,7 +92,7 @@
92
92
  },
93
93
  next: {
94
94
  symbol: '»',
95
- text: `${FULL_TEXT_DEFAULTS.next.default} »`,
95
+ text: FULL_TEXT_DEFAULTS.next.default,
96
96
  text_enforced: FULL_TEXT_DEFAULTS.next.enforced,
97
97
  title: 'Next site',
98
98
  path: 'next',
@@ -196,7 +196,7 @@
196
196
  `,
197
197
  layout: `
198
198
  .webring-nav {
199
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
199
+ font-family: var(--webring-font-family);
200
200
  font-size: 16px;
201
201
  display: flex;
202
202
  flex-direction: column;
@@ -210,7 +210,7 @@
210
210
  margin: 0 0 8px 0;
211
211
  padding: 0;
212
212
  font-size: inherit;
213
- line-height: normal;
213
+ line-height: 24px;
214
214
  }
215
215
  .webring-nav nav {
216
216
  display: flex;
@@ -230,6 +230,7 @@
230
230
  text-decoration: none;
231
231
  box-sizing: border-box;
232
232
  margin: 0;
233
+ line-height: 24px;
233
234
  }
234
235
  .webring-nav .webring-btn.random-btn {
235
236
  padding: 6px 8px;
@@ -260,6 +261,7 @@
260
261
  /* CSS Custom Properties for easy theming */
261
262
  .webring-nav {
262
263
  /* Internal variables that use public API with fallbacks */
264
+ --webring-font-family: var(--webring-theme-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif);
263
265
  --webring-bg-color: var(--webring-theme-bg);
264
266
  --webring-border-color: var(--webring-theme-border);
265
267
  --webring-text-color: var(--webring-theme-text);
@@ -1 +1 @@
1
- !function(){function n(n){function t(n){let t=document.getElementById(e.STYLE_ID);switch(t||(t=document.createElement("style"),t.id=e.STYLE_ID,document.head.insertBefore(t,document.head.firstChild)),n){case"none":t.textContent=g.reset;break;case"layout":t.textContent=g.reset+g.layout;break;default:t.textContent=g.reset+g.layout+g.design}}const r=n||document.currentScript||document.getElementsByTagName("script")[document.getElementsByTagName("script").length-1];if(!r)return;const i=r.getAttribute("data-member-uid"),s=r.getAttribute("data-widget-type")??e.DEFAULT_TYPE,w=r.getAttribute("data-target-id")??e.DEFAULT_TARGET_ID,c="false"!==r.getAttribute("data-button-text"),f=r.getAttribute("data-styles")??e.DEFAULT_STYLE_TYPE,m=e.VALID_STYLE_TYPES.includes(f)?f:e.DEFAULT_STYLE_TYPE,v=r.getAttribute("data-theme")??e.DEFAULT_THEME,x=e.VALID_THEMES.includes(v)?v:e.DEFAULT_THEME,p=r.getAttribute("data-prev-text"),u=r.getAttribute("data-random-text"),h=r.getAttribute("data-next-text"),E=r.getAttribute("data-widget-text");if(!i)return void console.error("Webring Widget: Missing data-member-uid attribute on script tag.");if(!e.VALID_TYPES.includes(s))return void console.error(`Webring Widget: Invalid widget type "${s}". Valid types: ${e.VALID_TYPES.join(", ")}`);const T=r.getAttribute("src"),y=new URL(T,window.location.href).origin,_=function(){const n=document.getElementById(w);if(!n)return void console.error(`Webring Widget: No element with id "${w}" found.`);l||(t(m),l=!0);const e=document.createDocumentFragment(),r=document.createElement("div");r.className="webring-nav",r.setAttribute("data-widget-type",s),r.setAttribute("data-button-text",c.toString()),r.setAttribute("data-theme",x);const g={prev:b.prev.text_enforced?b.prev:p?{...b.prev,text:`\xab ${p}`}:b.prev,random:b.random.text_enforced?b.random:u&&""!==u.trim()?{...b.random,text:`${o(20,20,"margin-right: 4px; margin-top: 1px;")} ${u}`}:b.random,next:b.next.text_enforced?b.next:h?{...b.next,text:`${h} \xbb`}:b.next,logoOnly:b.logoOnly},f=d[s];if(f.showTitle){const n=document.createElement("span");n.className="webring-title",n.innerHTML=a.widgetTitle.enforced?a.widgetTitle.default:E??a.widgetTitle.default,r.appendChild(n)}const v=document.createElement("nav");v.className="webring-buttons",f.actions.forEach((n=>{const e=g[n];if("logoOnly"===n){const n=document.createElement("div");return n.className=e.additionalClass,n.innerHTML=e.symbol,void v.appendChild(n)}const t=document.createElement("a");if(t.href=`${y}/webring/${e.path}?source_member_uid=${i}`,t.title=e.title,t.className=`webring-btn ${e.additionalClass}`,"one-way"===s&&f.showLogoInButton&&"next"===n){const n=b.next.text_enforced?a.next.default:h||g.next.text.replace(" \xbb","");t.innerHTML=c?`<span class="webring-logo-inline">${o(20,20)}</span> ${n} \xbb`:`<span class="webring-logo-inline">${o(20,20)}</span> ${e.symbol}`}else"random"!==n||!c||""!==u?.trim()&&void 0!==u?.trim()?t.innerHTML=c?e.text:e.symbol:t.innerHTML=o(23,23,"margin-top: 1px;");v.appendChild(t)})),r.appendChild(v),e.appendChild(r),n.innerHTML="",n.appendChild(e)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",_):_()}const e=Object.freeze({VALID_TYPES:Object.freeze(["full","no-text","two-way","one-way","random-only"]),DEFAULT_TYPE:"full",DEFAULT_TARGET_ID:"webring-widget",STYLE_ID:"webring-widget-styles",VALID_STYLE_TYPES:Object.freeze(["full","layout","none"]),DEFAULT_STYLE_TYPE:"full",VALID_THEMES:Object.freeze(["light","dark"]),DEFAULT_THEME:"light"}),t=Object.freeze({prev:{default:"\xab Prev",enforced:!1},random:{default:"Random",enforced:!1},next:{default:"Next \xbb",enforced:!1},widgetTitle:{default:"Webring",enforced:!1}}),r="<<REPLACE_ME_TEXT_DEFAULTS>>",i="<<REPLACE_ME_TEXT_DEFAULTS>>"!==r?"string"==typeof r?JSON.parse(r):r:{},a=Object.freeze(Object.keys(t).reduce(((n,e)=>{const r=i[e];return n[e]={default:r?.default??t[e].default,enforced:r?.enforced??t[e].enforced},n}),{})),o="<<REPLACE_ME_LOGO_SVG_FUNCTION>>",b=Object.freeze({prev:{symbol:"\xab",text:`\xab ${a.prev.default}`,text_enforced:a.prev.enforced,title:"Previous site",path:"previous",additionalClass:"prev-btn"},random:{symbol:o(23,23),text:`${o(20,20,"margin-right: 4px; margin-top: 1px;")} ${a.random.default}`,text_enforced:a.random.enforced,title:"Random site",path:"random",additionalClass:"random-btn"},next:{symbol:"\xbb",text:`${a.next.default} \xbb`,text_enforced:a.next.enforced,title:"Next site",path:"next",additionalClass:"next-btn"},logoOnly:{symbol:o(23,23),text:o(23,23),path:"",additionalClass:"logo-only"}}),d=Object.freeze({full:{showTitle:!0,actions:["prev","random","next"]},"no-text":{showTitle:!1,actions:["prev","random","next"]},"two-way":{showTitle:!1,actions:["prev","logoOnly","next"],showLogoInMiddle:!0},"one-way":{showTitle:!1,actions:["next"],showLogoInButton:!0},"random-only":{showTitle:!1,actions:["random"]}}),g=Object.freeze({reset:"\n .webring-nav,\n .webring-nav div,\n .webring-nav span,\n .webring-nav nav,\n .webring-nav a,\n .webring-nav div::before,\n .webring-nav span::before,\n .webring-nav nav::before,\n .webring-nav a::before,\n .webring-nav div::after,\n .webring-nav span::after,\n .webring-nav nav::after,\n .webring-nav a::after {\n all: initial;\n box-sizing: border-box;\n }\n\n .webring-nav,\n .webring-nav div,\n .webring-nav span,\n .webring-nav nav,\n .webring-nav a {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: inherit;\n }\n\n .webring-nav div,\n .webring-nav span,\n .webring-nav nav,\n .webring-nav a {\n display: initial;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n text-decoration: none;\n color: inherit;\n font-weight: inherit;\n font-size: inherit;\n line-height: inherit;\n vertical-align: baseline;\n box-shadow: none;\n outline: none;\n transform: none;\n opacity: 1;\n visibility: visible;\n position: static;\n float: none;\n clear: none;\n overflow: visible;\n white-space: normal;\n text-align: left;\n letter-spacing: normal;\n word-spacing: normal;\n text-transform: none;\n text-shadow: none;\n list-style: none;\n border-radius: 0;\n min-width: auto;\n max-width: none;\n min-height: auto;\n max-height: none;\n width: auto;\n height: auto;\n top: auto;\n right: auto;\n bottom: auto;\n left: auto;\n z-index: auto;\n }\n\n .webring-nav a {\n cursor: pointer;\n }\n ",layout:'\n .webring-nav {\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;\n font-size: 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n max-width: 350px;\n margin: 0 auto;\n padding: 10px;\n box-sizing: border-box;\n }\n .webring-nav .webring-title {\n margin: 0 0 8px 0;\n padding: 0;\n font-size: inherit;\n line-height: normal;\n }\n .webring-nav nav {\n display: flex;\n gap: 10px;\n width: 100%;\n justify-content: center;\n align-items: center;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n .webring-nav .webring-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 12px;\n text-decoration: none;\n box-sizing: border-box;\n margin: 0;\n }\n .webring-nav .webring-btn.random-btn {\n padding: 6px 8px;\n }\n .webring-nav nav .logo-only {\n padding: 8px 3px 6px 3px;\n margin: 0;\n }\n .webring-nav[data-widget-type="no-text"] {\n padding: 8px 10px;\n }\n .webring-nav[data-widget-type="one-way"] {\n max-width: 200px;\n }\n .webring-nav .webring-logo-inline {\n display: inline-block;\n vertical-align: middle;\n margin: 1px 6px 0 0;\n }\n .webring-nav[data-button-text="false"] .prev-btn {\n padding: 5px 12.5px 6px 12px;\n }\n .webring-nav[data-button-text="false"] .next-btn {\n padding: 5px 12px 6px 12.5px;\n }\n ',design:'\n /* CSS Custom Properties for easy theming */\n .webring-nav {\n /* Internal variables that use public API with fallbacks */\n --webring-bg-color: var(--webring-theme-bg);\n --webring-border-color: var(--webring-theme-border);\n --webring-text-color: var(--webring-theme-text);\n --webring-btn-bg: var(--webring-theme-btn-bg);\n --webring-btn-border: var(--webring-theme-btn-border);\n --webring-btn-text: var(--webring-theme-btn-text);\n --webring-btn-hover-bg: var(--webring-theme-btn-hover-bg);\n --webring-btn-hover-text: var(--webring-theme-btn-hover-text);\n }\n\n /* Common theme styles using CSS variables */\n .webring-nav {\n background-color: var(--webring-bg-color);\n }\n .webring-nav[data-widget-type="full"] {\n border: 2.5px solid var(--webring-border-color);\n }\n .webring-nav .webring-title {\n font-weight: 600;\n color: var(--webring-text-color);\n }\n .webring-nav .webring-btn {\n text-wrap: nowrap;\n font-weight: 600;\n color: var(--webring-btn-text);\n background-color: var(--webring-btn-bg);\n border: 2.5px solid var(--webring-btn-border);\n transition: background-color 0.2s ease, color 0.2s ease;\n }\n .webring-nav .webring-btn:focus {\n outline: none;\n background-color: transparent;\n color: var(--webring-btn-text);\n }\n .webring-nav .webring-btn:hover,\n .webring-nav .webring-btn:active {\n background-color: var(--webring-btn-hover-bg);\n color: var(--webring-btn-hover-text);\n }\n .webring-nav svg {\n fill: currentColor;\n }\n\n /* Light theme defaults */\n .webring-nav {\n --webring-theme-bg: #ffffff;\n --webring-theme-border: #000000;\n --webring-theme-text: #000000;\n --webring-theme-btn-bg: #ffffff;\n --webring-theme-btn-border: #000000;\n --webring-theme-btn-text: #000000;\n --webring-theme-btn-hover-bg: #000000;\n --webring-theme-btn-hover-text: #ffffff;\n }\n\n /* Dark theme overrides */\n .webring-nav[data-theme="dark"] {\n --webring-theme-bg: #000000;\n --webring-theme-border: #ffffff;\n --webring-theme-text: #ffffff;\n --webring-theme-btn-bg: #000000;\n --webring-theme-btn-border: #ffffff;\n --webring-theme-btn-text: #ffffff;\n --webring-theme-btn-hover-bg: #ffffff;\n --webring-theme-btn-hover-text: #000000;\n }\n '});let l=!1;n()}();
1
+ !function(){function n(n){function t(n){let t=document.getElementById(e.STYLE_ID);switch(t||(t=document.createElement("style"),t.id=e.STYLE_ID,document.head.insertBefore(t,document.head.firstChild)),n){case"none":t.textContent=d.reset;break;case"layout":t.textContent=d.reset+d.layout;break;default:t.textContent=d.reset+d.layout+d.design}}const r=n||document.currentScript||document.getElementsByTagName("script")[document.getElementsByTagName("script").length-1];if(!r)return;const i=r.getAttribute("data-member-uid"),s=r.getAttribute("data-widget-type")??e.DEFAULT_TYPE,f=r.getAttribute("data-target-id")??e.DEFAULT_TARGET_ID,w="false"!==r.getAttribute("data-button-text"),c=r.getAttribute("data-styles")??e.DEFAULT_STYLE_TYPE,m=e.VALID_STYLE_TYPES.includes(c)?c:e.DEFAULT_STYLE_TYPE,v=r.getAttribute("data-theme")??e.DEFAULT_THEME,x=e.VALID_THEMES.includes(v)?v:e.DEFAULT_THEME,p=r.getAttribute("data-prev-text"),u=r.getAttribute("data-random-text"),h=r.getAttribute("data-next-text"),E=r.getAttribute("data-widget-text");if(!i)return void console.error("Webring Widget: Missing data-member-uid attribute on script tag.");if(!e.VALID_TYPES.includes(s))return void console.error(`Webring Widget: Invalid widget type "${s}". Valid types: ${e.VALID_TYPES.join(", ")}`);const y=r.getAttribute("src"),T=new URL(y,window.location.href).origin,_=function(){const n=document.getElementById(f);if(!n)return void console.error(`Webring Widget: No element with id "${f}" found.`);l||(t(m),l=!0);const e=document.createDocumentFragment(),r=document.createElement("div");r.className="webring-nav",r.setAttribute("data-widget-type",s),r.setAttribute("data-button-text",w.toString()),r.setAttribute("data-theme",x);const d={prev:b.prev.text_enforced?b.prev:p?{...b.prev,text:`\xab ${p}`}:b.prev,random:b.random.text_enforced?b.random:u&&""!==u.trim()?{...b.random,text:`${o(20,20,"margin-right: 4px; margin-top: 1px;")} ${u}`}:b.random,next:b.next.text_enforced?b.next:h?{...b.next,text:`${h} \xbb`}:b.next,logoOnly:b.logoOnly},c=g[s];if(c.showTitle){const n=document.createElement("span");n.className="webring-title",n.innerHTML=a.widgetTitle.enforced?a.widgetTitle.default:E??a.widgetTitle.default,r.appendChild(n)}const v=document.createElement("nav");v.className="webring-buttons",c.actions.forEach((n=>{const e=d[n];if("logoOnly"===n){const n=document.createElement("div");return n.className=e.additionalClass,n.innerHTML=e.symbol,void v.appendChild(n)}const t=document.createElement("a");if(t.href=`${T}/webring/${e.path}?source_member_uid=${i}`,t.title=e.title,t.className=`webring-btn ${e.additionalClass}`,"one-way"===s&&c.showLogoInButton&&"next"===n){const n=b.next.text_enforced?a.next.default:h||d.next.text.replace(" \xbb","");t.innerHTML=w?`<span class="webring-logo-inline">${o(20,20)}</span> ${n} \xbb`:`<span class="webring-logo-inline">${o(20,20)}</span> ${e.symbol}`}else"random"!==n||!w||""!==u?.trim()&&void 0!==u?.trim()?t.innerHTML=w?e.text:e.symbol:t.innerHTML=o(23,23,"margin-top: 1px;");v.appendChild(t)})),r.appendChild(v),e.appendChild(r),n.innerHTML="",n.appendChild(e)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",_):_()}const e=Object.freeze({VALID_TYPES:Object.freeze(["full","no-text","two-way","one-way","random-only"]),DEFAULT_TYPE:"full",DEFAULT_TARGET_ID:"webring-widget",STYLE_ID:"webring-widget-styles",VALID_STYLE_TYPES:Object.freeze(["full","layout","none"]),DEFAULT_STYLE_TYPE:"full",VALID_THEMES:Object.freeze(["light","dark"]),DEFAULT_THEME:"light"}),t=Object.freeze({prev:{default:"\xab Prev",enforced:!1},random:{default:"Random",enforced:!1},next:{default:"Next \xbb",enforced:!1},widgetTitle:{default:"Webring",enforced:!1}}),r="<<REPLACE_ME_TEXT_DEFAULTS>>",i="<<REPLACE_ME_TEXT_DEFAULTS>>"!==r?"string"==typeof r?JSON.parse(r):r:{},a=Object.freeze(Object.keys(t).reduce(((n,e)=>{const r=i[e];return n[e]={default:r?.default??t[e].default,enforced:r?.enforced??t[e].enforced},n}),{})),o="<<REPLACE_ME_LOGO_SVG_FUNCTION>>",b=Object.freeze({prev:{symbol:"\xab",text:a.prev.default,text_enforced:a.prev.enforced,title:"Previous site",path:"previous",additionalClass:"prev-btn"},random:{symbol:o(23,23),text:`${o(20,20,"margin-right: 4px; margin-top: 1px;")} ${a.random.default}`,text_enforced:a.random.enforced,title:"Random site",path:"random",additionalClass:"random-btn"},next:{symbol:"\xbb",text:a.next.default,text_enforced:a.next.enforced,title:"Next site",path:"next",additionalClass:"next-btn"},logoOnly:{symbol:o(23,23),text:o(23,23),path:"",additionalClass:"logo-only"}}),g=Object.freeze({full:{showTitle:!0,actions:["prev","random","next"]},"no-text":{showTitle:!1,actions:["prev","random","next"]},"two-way":{showTitle:!1,actions:["prev","logoOnly","next"],showLogoInMiddle:!0},"one-way":{showTitle:!1,actions:["next"],showLogoInButton:!0},"random-only":{showTitle:!1,actions:["random"]}}),d=Object.freeze({reset:"\n .webring-nav,\n .webring-nav div,\n .webring-nav span,\n .webring-nav nav,\n .webring-nav a,\n .webring-nav div::before,\n .webring-nav span::before,\n .webring-nav nav::before,\n .webring-nav a::before,\n .webring-nav div::after,\n .webring-nav span::after,\n .webring-nav nav::after,\n .webring-nav a::after {\n all: initial;\n box-sizing: border-box;\n }\n\n .webring-nav,\n .webring-nav div,\n .webring-nav span,\n .webring-nav nav,\n .webring-nav a {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: inherit;\n }\n\n .webring-nav div,\n .webring-nav span,\n .webring-nav nav,\n .webring-nav a {\n display: initial;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n text-decoration: none;\n color: inherit;\n font-weight: inherit;\n font-size: inherit;\n line-height: inherit;\n vertical-align: baseline;\n box-shadow: none;\n outline: none;\n transform: none;\n opacity: 1;\n visibility: visible;\n position: static;\n float: none;\n clear: none;\n overflow: visible;\n white-space: normal;\n text-align: left;\n letter-spacing: normal;\n word-spacing: normal;\n text-transform: none;\n text-shadow: none;\n list-style: none;\n border-radius: 0;\n min-width: auto;\n max-width: none;\n min-height: auto;\n max-height: none;\n width: auto;\n height: auto;\n top: auto;\n right: auto;\n bottom: auto;\n left: auto;\n z-index: auto;\n }\n\n .webring-nav a {\n cursor: pointer;\n }\n ",layout:'\n .webring-nav {\n font-family: var(--webring-font-family);\n font-size: 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n max-width: 350px;\n margin: 0 auto;\n padding: 10px;\n box-sizing: border-box;\n }\n .webring-nav .webring-title {\n margin: 0 0 8px 0;\n padding: 0;\n font-size: inherit;\n line-height: 24px;\n }\n .webring-nav nav {\n display: flex;\n gap: 10px;\n width: 100%;\n justify-content: center;\n align-items: center;\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n .webring-nav .webring-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 12px;\n text-decoration: none;\n box-sizing: border-box;\n margin: 0;\n line-height: 24px;\n }\n .webring-nav .webring-btn.random-btn {\n padding: 6px 8px;\n }\n .webring-nav nav .logo-only {\n padding: 8px 3px 6px 3px;\n margin: 0;\n }\n .webring-nav[data-widget-type="no-text"] {\n padding: 8px 10px;\n }\n .webring-nav[data-widget-type="one-way"] {\n max-width: 200px;\n }\n .webring-nav .webring-logo-inline {\n display: inline-block;\n vertical-align: middle;\n margin: 1px 6px 0 0;\n }\n .webring-nav[data-button-text="false"] .prev-btn {\n padding: 5px 12.5px 6px 12px;\n }\n .webring-nav[data-button-text="false"] .next-btn {\n padding: 5px 12px 6px 12.5px;\n }\n ',design:'\n /* CSS Custom Properties for easy theming */\n .webring-nav {\n /* Internal variables that use public API with fallbacks */\n --webring-font-family: var(--webring-theme-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif);\n --webring-bg-color: var(--webring-theme-bg);\n --webring-border-color: var(--webring-theme-border);\n --webring-text-color: var(--webring-theme-text);\n --webring-btn-bg: var(--webring-theme-btn-bg);\n --webring-btn-border: var(--webring-theme-btn-border);\n --webring-btn-text: var(--webring-theme-btn-text);\n --webring-btn-hover-bg: var(--webring-theme-btn-hover-bg);\n --webring-btn-hover-text: var(--webring-theme-btn-hover-text);\n }\n\n /* Common theme styles using CSS variables */\n .webring-nav {\n background-color: var(--webring-bg-color);\n }\n .webring-nav[data-widget-type="full"] {\n border: 2.5px solid var(--webring-border-color);\n }\n .webring-nav .webring-title {\n font-weight: 600;\n color: var(--webring-text-color);\n }\n .webring-nav .webring-btn {\n text-wrap: nowrap;\n font-weight: 600;\n color: var(--webring-btn-text);\n background-color: var(--webring-btn-bg);\n border: 2.5px solid var(--webring-btn-border);\n transition: background-color 0.2s ease, color 0.2s ease;\n }\n .webring-nav .webring-btn:focus {\n outline: none;\n background-color: transparent;\n color: var(--webring-btn-text);\n }\n .webring-nav .webring-btn:hover,\n .webring-nav .webring-btn:active {\n background-color: var(--webring-btn-hover-bg);\n color: var(--webring-btn-hover-text);\n }\n .webring-nav svg {\n fill: currentColor;\n }\n\n /* Light theme defaults */\n .webring-nav {\n --webring-theme-bg: #ffffff;\n --webring-theme-border: #000000;\n --webring-theme-text: #000000;\n --webring-theme-btn-bg: #ffffff;\n --webring-theme-btn-border: #000000;\n --webring-theme-btn-text: #000000;\n --webring-theme-btn-hover-bg: #000000;\n --webring-theme-btn-hover-text: #ffffff;\n }\n\n /* Dark theme overrides */\n .webring-nav[data-theme="dark"] {\n --webring-theme-bg: #000000;\n --webring-theme-border: #ffffff;\n --webring-theme-text: #ffffff;\n --webring-theme-btn-bg: #000000;\n --webring-theme-btn-border: #ffffff;\n --webring-theme-btn-text: #ffffff;\n --webring-theme-btn-hover-bg: #ffffff;\n --webring-theme-btn-hover-text: #000000;\n }\n '});let l=!1;n()}();
@@ -31,29 +31,29 @@ module Webring
31
31
  # PATCH/PUT /webring/members/1
32
32
  def update
33
33
  if member.update(member_params)
34
- update_success_response
34
+ handle_update_success
35
35
  else
36
- update_error_response
36
+ handle_update_error
37
37
  end
38
38
  end
39
39
 
40
40
  # DELETE /webring/members/1
41
41
  def destroy
42
- member.destroy
42
+ member.destroy!
43
43
 
44
44
  redirect_to admin_panel_members_url, notice: 'Member was successfully destroyed.'
45
45
  end
46
46
 
47
47
  private
48
48
 
49
- def update_success_response
49
+ def handle_update_success
50
50
  respond_to do |format|
51
51
  format.html { redirect_to admin_panel_member_path(member), notice: 'Member was successfully updated.' }
52
52
  format.json { head :ok }
53
53
  end
54
54
  end
55
55
 
56
- def update_error_response
56
+ def handle_update_error
57
57
  respond_to do |format|
58
58
  format.html { render :edit, status: :unprocessable_entity }
59
59
  format.json { render json: { status: 'error', errors: member.errors }, status: :unprocessable_entity }
@@ -61,7 +61,7 @@ module Webring
61
61
  end
62
62
 
63
63
  def members
64
- @members ||= Member.all.order(created_at: :desc)
64
+ @members ||= Member.order(created_at: :desc)
65
65
  end
66
66
 
67
67
  def member
@@ -5,50 +5,46 @@ module Webring
5
5
  # If current member is the last, return the first member (ring concept)
6
6
  def find_next(source_member_uid)
7
7
  source_member = active.find_by(uid: source_member_uid)
8
- return first_active_member_by_creation unless source_member
8
+ return first_active_member unless source_member
9
9
 
10
- find_next_active_member(source_member) || first_active_member_by_creation
10
+ find_next_active_member(source_member) || first_active_member
11
11
  end
12
12
 
13
13
  # Find the previous member in the webring before the current one
14
14
  # If current member is the first, return the last member (ring concept)
15
15
  def find_previous(source_member_uid)
16
16
  source_member = active.find_by(uid: source_member_uid)
17
- return last_active_member_by_creation unless source_member
17
+ return last_active_member unless source_member
18
18
 
19
- find_previous_active_member(source_member) || last_active_member_by_creation
19
+ find_previous_active_member(source_member) || last_active_member
20
20
  end
21
21
 
22
22
  # Find a random member, excluding the current one if provided
23
23
  # If current member is the only one, return it
24
24
  def find_random(source_member_uid: nil)
25
- return active.order('RANDOM()').first if source_member_uid.blank?
25
+ scope = active
26
+ scope = scope.where.not(uid: source_member_uid) if source_member_uid.present?
26
27
 
27
- # Use exists? check to avoid loading records when not needed
28
- excluded_scope = active.where.not(uid: source_member_uid)
28
+ return scope.order('RANDOM()').first if scope.exists?
29
+ return active.find_by(uid: source_member_uid) if source_member_uid.present?
29
30
 
30
- if excluded_scope.exists?
31
- excluded_scope.order('RANDOM()').first
32
- else
33
- # if only one active member exists (the current one), return it
34
- active.find_by(uid: source_member_uid)
35
- end
31
+ nil
36
32
  end
37
33
 
38
34
  private
39
35
 
40
- def first_active_member_by_creation
41
- active.order(created_at: :asc).first
36
+ def first_active_member
37
+ @first_active_member ||= active.order(:created_at).first
42
38
  end
43
39
 
44
- def last_active_member_by_creation
45
- active.order(created_at: :desc).first
40
+ def last_active_member
41
+ @last_active_member ||= active.order(created_at: :desc).first
46
42
  end
47
43
 
48
44
  def find_next_active_member(source_member)
49
45
  active
50
46
  .where('created_at > ?', source_member.created_at)
51
- .order(created_at: :asc)
47
+ .order(:created_at)
52
48
  .first
53
49
  end
54
50
 
@@ -46,19 +46,19 @@ module Webring
46
46
  { line: 'class Member < ApplicationRecord', inject_options: { after: "class Member < ApplicationRecord\n" } }
47
47
  ]
48
48
 
49
- if File.exist?(member_model_path)
50
- content = File.read(member_model_path)
51
- options = inject_conditions.find { |condition| content.include?(condition[:line]) }&.fetch(:inject_options)
52
- return if options.nil? || options.empty?
49
+ return unless File.exist?(member_model_path)
53
50
 
54
- inject_into_file member_model_path, **options do
55
- " belongs_to :membership_request,\n" \
56
- " class_name: 'Webring::MembershipRequest',\n" \
57
- " foreign_key: :webring_membership_request_id,\n" \
58
- " optional: true,\n" \
59
- " inverse_of: :member\n" \
60
- "\n"
61
- end
51
+ content = File.read(member_model_path)
52
+ options = inject_conditions.find { |condition| content.include?(condition[:line]) }&.fetch(:inject_options)
53
+ return if options.blank?
54
+
55
+ inject_into_file member_model_path, **options do
56
+ " belongs_to :membership_request,\n" \
57
+ " class_name: 'Webring::MembershipRequest',\n" \
58
+ " foreign_key: :webring_membership_request_id,\n" \
59
+ " optional: true,\n" \
60
+ " inverse_of: :member\n" \
61
+ "\n"
62
62
  end
63
63
  end
64
64
 
@@ -1,3 +1,3 @@
1
1
  module Webring
2
- VERSION = '1.7.3'.freeze
2
+ VERSION = '1.7.5'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webring-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.3
4
+ version: 1.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Shkoda